Socket,BufferedReader挂起在readLine()

ash*_*him 13 java sockets io bufferedreader

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

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

稍后它将套接字传递给另一个类"foo"此类等待特定于应用程序的消息.

 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 appCmd=br.readLine();
Run Code Online (Sandbox Code Playgroud)

我的客户端发送以下序列:

  • "谷仓"
  • "你怎么样?\n"
  • "\n"
  • "将它传递给foo \n"
  • "\n"

问题是有时"foo"没有得到它的回应.它挂在了readLine().

readLine()使用提前读取服务器在服务器中缓存数据的可能性是多少?"foo"类正在变得饥饿?

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

  • "谷仓"
  • "你怎么样?\n"
  • "\n"
  • sleep(1000);
  • "将它传递给foo \n"
  • "\n"

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

moj*_*ado 22

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

while ((response = br.readLine()) != null) {
    ...Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

改为:

while (br.ready()) {
    response = br.readLine();
    ...Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

我可以读完一切就好了.br是一个BufferedReader对象,BTW.

  • 在ready()之后使用readLine()时,通常要小心。Ready()告诉您有要读取的数据,但这并不意味着它是一整行。因此readLine()仍然可以阻止。 (2认同)

MeB*_*Guy 2

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