Java 中的 Netcat 通信

问题描述 投票:0回答:2

我正在尝试从 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 的任何替代品吗?

java sockets unix nagios netcat
2个回答
0
投票

您可以从 Java 运行程序,包括 netcat。请参阅

Runtime.exec()

netcat 只是一个打开套接字、对其进行写入和读取的程序。您可以直接在 Java 中执行此操作(打开套接字,写入并从中读取),而无需处理管道和子进程。将您使用 java.io.Socket 编写的 Java 程序添加到您的问题中。我的第一个猜测是您没有设置 TCP_NODELAY 标志和/或没有刷新缓冲流,因此服务器没有收到您的请求。


创建套接字后,尝试设置 TCP_NODELAY:

socket.setTcpNoDelay(true);

使用 Wireshark 或类似工具捕获网络流量并查看您的消息是否确实发送到服务器。


0
投票

通过使用 http://junixsocket.googlecode.com/ 并直接访问服务器上的 UNIX 套接字解决了该问题。

© www.soinside.com 2019 - 2024. All rights reserved.