[英]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();
我的客戶發送這個序列:
問題是有時“foo”沒有得到它的響應。 它掛在readLine()
。
服務器中的readLine()
使用readLine()
讀緩沖數據並且“foo”類變得飢餓的可能性有多大?
如果我在客戶端添加睡眠,它會起作用。 但它總是有效的機會有多大?
sleep(1000);
如何解決問題? 感謝這方面的任何幫助。
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.