Java 使用BufferedReader(套接字)读取多行

Java 使用BufferedReader(套接字)读取多行,java,sockets,bufferedreader,Java,Sockets,Bufferedreader,我已经读了一些关于stackoverflow的文章,还有一些教程,但是我没有找到解决问题的方法 我有一个Java客户机,它连接到一个服务器,然后只向服务器发送一行,我得到2或3行作为响应 这是我的密码: public static void main(String[] args) { String message; String response; try { BufferedReader inFromUser = new 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");
    }
}

我的问题是,我可以读取每一行响应,但我的程序不会退出。clientSocket.close()行;从未接到过电话。我做错了什么?

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


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

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


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

好,谢谢您的回答。我们的连接没有真正的协议,服务器会发送一条类似“您的帐户已成功注册”的消息,然后就结束了。我认为有一个很好的解决方案,我不想检查response.contains(例如“成功注册”)是否存在。@beeef:有一个协议,即使它是隐式的。听起来服务器应该正在关闭连接。。。但是坦率地说,如果您让服务器和客户端都使用HTTP,那么可能会更简单,因为几乎所有广泛使用的平台都支持HTTP……好的,谢谢您的回答。我们的连接没有真正的协议,服务器会发送一条类似“您的帐户已成功注册”的消息,然后就结束了。我认为有一个很好的解决方案,我不想检查response.contains(例如“成功注册”)是否存在。@beeef:有一个协议,即使它是隐式的。听起来服务器应该正在关闭连接。。。但是坦率地说,如果让服务器和客户机都使用HTTP,这可能会更简单,因为几乎所有广泛使用的平台都支持HTTP。。。