套接字,缓冲读取器在 readLine() 处挂起

2022-09-02 09:35:55

我有一个服务器,最初这样做:-

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”
  • “\n”
  • “将其传递给 foo\n”
  • “\n”

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

在服务器中使用提前读取缓冲数据并且“foo”类挨饿的可能性有多大?readLine()

如果我在客户端添加睡眠,它可以工作。但是,它永远有效的可能性有多大?

  • “酒吧\n”
  • “你好吗?\n”
  • “\n”
  • sleep(1000);
  • “将其传递给 foo\n”
  • “\n”

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


答案 1

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

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

更改为:

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

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


答案 2

第一个示例中已有数据(已从套接字读取,并且不再从套接字中可用),因此请将第一个示例中创建的数据传递给读取应用特定消息的类,而不是从套接字创建新消息。BufferedReaderBufferedReaderBufferedReader


推荐