使用 BufferedReader (Socket) 读取多行

bee*_*eef 0 java sockets bufferedreader

我已经在 stackoverflow 上阅读了一些帖子,还有一些教程,但我没有找到问题的解决方案。

我有一个 Java 客户端,它连接到服务器,然后向服务器发送一行,然后我得到 2 或 3 行作为响应。

这是我的代码:

public static void main(String[] args) {
    String message;
    String response;

    try {
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
        Socket clientSocket = new Socket(hostname, port);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        message = inFromUser.readLine();
        outToServer.writeBytes(message + '\n');

        // here my program "freezes"
        while ((response = inFromServer.readLine()) != null) {
          System.out.println("response: " + response);
        }
        clientSocket.close();
    } catch (UnknownHostException e) {
        System.out.println("Unknown Host");
    } catch (IOException e) {
        System.out.println("IO Exception");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以读取响应的每一行,但我的程序不会退出。clientSocket.close();行 从来没有被叫过。我究竟做错了什么?

Jon*_*eet 5

大概您的服务器没有关闭连接 - 因此读取器的底层流没有关闭......服务器可以在任何时候发送更多信息。readLine()null当流关闭时才返回,即肯定不会再有任何数据。

现在我们对这里的协议一无所知,但是如果预期的行为是客户端不会发送更多信息,并且服务器将关闭连接,那么错误就在服务器中。如果协议规定服务器将保持连接打开,则错误出在您的客户端代码中,您需要弄清楚如何检测数据结束(或发送某种确认,这将导致服务器关闭连接) , 管他呢)。