Socket,BufferedReader挂起在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()使用提前读取缓存数据的可能性是多少,“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对象,BTW。

第一个BufferedReader已存在数据(已从套接字读取,并且不再可从套接字中获取),因此将第一个示例中创建的BufferedReader传递给读取特定于应用程序的消息的类,而不是创建来自套接字的新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 ""; }