簡體   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