繁体   English   中英

套接字,BufferedReader 挂在 readLine()

[英]Socket, BufferedReader hangs at readLine()

我有一个最初执行此操作的服务器:-

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
for (;;) {
  String cmdLine = br.readLine();
  if (cmdLine == null || cmdLine.length() == 0)
     break; 
  ...
}

稍后它将套接字传递给另一个类“foo”这个类等待应用程序特定的消息。

 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 appCmd=br.readLine();

我的客户发送这个序列:

  • “谷仓”
  • “你好吗?\\n”
  • "\\n"
  • “将它传递给 foo\\n”
  • "\\n"

问题是有时“foo”没有得到它的响应。 它挂在readLine()

服务器中的readLine()使用readLine()读缓冲数据并且“foo”类变得饥饿的可能性有多大?

如果我在客户端添加睡眠,它会起作用。 但它总是有效的机会有多大?

  • “谷仓”
  • “你好吗?\\n”
  • "\\n"
  • sleep(1000);
  • “将它传递给 foo\\n”
  • "\\n"

如何解决问题? 感谢这方面的任何帮助。

eee 的解决方案非常有效。 我试图从 SMTP 对话中读取输出,但它会阻止:

while ((response = br.readLine()) != null) {
    ...Do Stuff
}

更改为:

while (br.ready()) {
    response = br.readLine();
    ...Do Stuff
}

我可以很好地阅读所有内容。 br 是一个 BufferedReader 对象,顺便说一句。

我遇到了同样的问题,这是我的解决方案:

try {
    StringBuilder response = new StringBuilder();
    response.append("SERVER -> CLIENT message:").append(CRLF);
    //Infinite loop
    while (true) {
        //Checks wheather the stream is ready
        if (in.ready()) {
            //Actually read line 
            lastLineFromServer = in.readLine();
            //If we have normal behavior at the end of stream
            if (lastLineFromServer != null) {
                response
                        .append(lastLineFromServer)
                        .append(CRLF);
            } else {
                return response.toString();
            }
        } else {//If stream is not ready
            //If number of tries is not exceeded
            if (numberOfTry < MAX_NUMBER_OF_TRIES) {
                numberOfTry++;
                //Wait for stream to become ready
                Thread.sleep(MAX_DELAY_BEFORE_NEXT_TRY);
            } else {//If number of tries is exeeded
                //Adds warning that things go weired
                response
                        .append("WARNING \r\n")
                        .append("Server sends responses not poroperly.\r\n")
                        .append("Response might be incomplete.")
                        .append(CRLF);
                return response.toString();
            }
        }
    }
} catch (Exception ex) {
    ex.printStackTrace();
    return "";
}

第一个BufferedReader已经有数据(已从套接字读取,不再从套接字中可用),因此将第一个示例中创建的BufferedReader传递给读取应用程序特定消息的类,而不是创建一个来自套接字的新BufferedReader

答案可能晚了,但这是 2020 年最简单最新的答案,只需使用输入流read()方法使用简单的方式从套接字服务器或客户端接收数据即可。

当客户端断开连接或服务器关闭连接时将抛出EOFException

private String waitForData() throws IOException {
    String data = "";
    do {
        int c = inputStream.read();
        if (c > -1) data += (char) c;
        else throw new EOFException();
    } while (inputStream.available() > 0);
    return data;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM