我正在尝试从 Java 应用程序建立到服务器的连接。我可以通过在 shell 中输入来从服务器获取数据:
cat query.txt | nc server port
现在,我正在尝试在 Java 中做同样的事情。我已经尝试过一些第三方 API,例如 jetcat。服务器应该也可以通过 Unix 套接字访问,但目前我无法获得连接。
标准 Java 套接字也不起作用。当我发送查询时,服务器从未回复。
public class Server {
private Socket socket;
public Server(String url, int port) throws UnknownHostException, IOException {
socket = new Socket(url, port);
}
void sendMessage(String nachricht) throws IOException {
PrintWriter printWriter = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()));
printWriter.print(nachricht);
printWriter.flush();
}
public void read() throws IOException {
Thread t = new Thread(new Runnable() {
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[200];
int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
System.out.println(new String(buffer, 0, anzahlZeichen));
} catch(IOException e) {
e.printStackTrace();
}
}
});
t.start();}}
该系统是基于Nagios并使用LQL(Livestatus查询语言)的Check_MK
有什么想法如何在 Java 中使用 netcat - 或 netcat 的任何替代品吗?
Runtime.exec()
。
netcat 只是一个打开套接字、对其进行写入和读取的程序。您可以直接在 Java 中执行此操作(打开套接字,写入并从中读取),而无需处理管道和子进程。将您使用 java.io.Socket 编写的 Java 程序添加到您的问题中。我的第一个猜测是您没有设置 TCP_NODELAY 标志和/或没有刷新缓冲流,因此服务器没有收到您的请求。
socket.setTcpNoDelay(true);
使用 Wireshark 或类似工具捕获网络流量并查看您的消息是否确实发送到服务器。
通过使用 http://junixsocket.googlecode.com/ 并直接访问服务器上的 UNIX 套接字解决了该问题。