【问题标题】:Read multiple lines using BufferedReader (Socket)使用 BufferedReader (Socket) 读取多行
【发布时间】:2015-10-07 07:54:59
【问题描述】:

我已经在 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");
    }
}

我的问题是,我可以阅读响应的每一行,但我的程序不会退出。 clientSocket.close(); 行永远不会被调用。我做错了什么?

【问题讨论】:

    标签: java sockets bufferedreader


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢您的回答。我们的连接并没有真正的协议,服务器会发送一条消息,例如“您的帐户已成功注册”。然后就结束了。我认为有一个优雅的解决方案可用,我不想检查 response.contains("successfully registered") 例如。
    • @beeef:一个协议,即使它是隐含的。听起来服务器应该关闭连接......但坦率地说,如果您只是让服务器和客户端都使用 HTTP,那么它可能会更简单,因为几乎每个可用的广泛使用的平台都对 HTTP 有很好的支持。 ..
    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 2017-06-09
    • 1970-01-01
    • 2013-10-30
    • 2015-05-12
    • 2019-01-09
    • 2014-03-08
    • 2021-09-30
    相关资源
    最近更新 更多