【问题标题】:BufferedReader keeps waiting for responseBufferedReader 一直在等待响应
【发布时间】:2016-02-04 03:12:12
【问题描述】:

我有一个服务器和客户端在本地服务器上运行。

我是这样从服务器读取的:

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

public static String readResponse() throws IOException{
    String response = "";
    String line;
    while((line = br.readLine()) != ""){
        System.out.println("s: " + line);
    }
    return response;

}

我得到了服务器的响应,但程序停止并且没有从那里去任何地方:

Please enter option number: 1 
c: MSGGET
s: 200 OK
s: Go for it now. The future is promised to no one.

它只是挂在这里,当它应该继续时。

我也试过了:

while((line = br.readLine()) != null){

它只是一直在等待。服务器上是否有任何东西我必须更改以告诉客户端我已完成数据传输。

请帮忙!谢谢!

【问题讨论】:

  • 不是你的问题(但我一开始以为是);这不是你比较String(s) 的方式。试试while (!(line = br.readLine()).isEmpty()) {
  • @ElliottFrisch 谢谢!我尝试过这个。有同样的问题!
  • 它会阻塞,直到收到要读取的内容。

标签: java client client-server bufferedreader


【解决方案1】:
while((line = br.readLine()) != ""){
        System.out.println("s: " + line);
    }
    return response;

}

除非您的对等方计划传输一个空白行作为消息结束标记,否则此循环是没有意义的,而且它还会错误地比较字符串。

我得到了服务器的响应,但是程序停止了并且没有从那里去任何地方。

它正在等待一个永远不会到达的空行。它忽略了流条件的结束。

while((line = br.readLine()) != null){

现在这个循环是正确的,但它直到流结束才会退出,直到对等端关闭连接才会发生。

它只是一直在等待。

这就是它应该做的。

【讨论】:

  • 这种情况下服务器应该断开连接吗?我只是做 while(br.ready()) ?
  • 第一个问题完全取决于你的应用协议。如果您只期待一个响应,则服务器应在发送后关闭连接。否则你需要根据你的协议调整你的循环:也许你的服务器每个响应只发送一行?我不知道。不要不要使用ready()available()。这不是他们的目的。
【解决方案2】:

试试这个:

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    public static String readResponse() throws IOException{
        String response = "";
        String line;
        while((line = br.readLine()) != "" || (line = br.readLine()) != null)){
            System.out.println("s: " + line);
        }
        return response;

    }

如果这不起作用,那么您需要检查您是否在服务器的流末尾发送了一些特殊字符。然后对该字符应用检查。

【讨论】:

  • 测试!= "" 完全没有意义,第二次readLine() 调用会丢弃一行输入。
  • 编辑了我对括号错误的回答。请恢复。我检查了 != "" 只是作为一个样本。我在下面写过,如果有一个特殊字符来表示流的结束,那么我们应该对此进行检查
  • 你没有纠正我提到的任何一个问题。
【解决方案3】:

我最终使用了这个:

while(!(line = br.readLine()).equals("exit")){

我要求负责服务器的人在写完回复后打印以下内容:

//this was initiated at the beginning of the program
out = new PrintWriter(socket.getOutputStream(), true);

out.println("exit");

到目前为止,这似乎对我很有效! 谢谢你们每一个人的帮助!

【讨论】:

  • 如果流的结尾在“exit”之前到达,这将无限循环。你必须先测试 null 。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2021-09-30
  • 2017-01-03
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多