[英]Java/android socket.close() is not realized by server
我在嘗試獲取 java 服務器以實現(android/java)客戶端已關閉 TCP 套接字連接時遇到問題。 我想當客戶端在socket
上調用close()
時,服務器會捕獲一個IOException
,但事實並非如此。 t_recv
是從BufferedReader in
接收的線程,而t_send
使用PrintWriter out
發送。 關閉in
導致out
和崩潰,而關閉似乎並沒有真正做任何事情。 PrintWriter
是在t_send
線程的構造函數中創建的,而BufferedReader
是在t_recv
線程的構造函數中創建的。 嘗試對此進行調試,我在兩個線程中創建了空白run()
方法,並且發生了相同的行為。
一個有趣的提示:客戶端是一個 Android 應用程序,每當模擬器凍結並且 windows 必須強制關閉它時, IOException
會在服務器中捕獲並顯示“用戶 xxxx left”消息。
客戶端關閉連接:
try {
// t_recv.in.close(); - times out and crashes
// t_send.out.close(); - appears to do nothing
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
服務器等待客戶端斷開連接:
for (;;)
{
try {
while ( (msg = in.readLine()) != null)
{
response = msg;
System.out.println(response);
server.broadcast(response);
}
} catch (IOException e) {
System.out.println("User '" + socket.getInetAddress().toString() + "' left");
try {
socket.close();
out.close();
in.close();
} catch (IOException e1) {
e1.printStackTrace();
System.exit(-1);
}
break;
}
}
謝謝你的時間。
假設in
是一個 BufferedReader,錯誤就在這一行:
while ( (msg = in.readLine()) == null);
如果in
當前位於 EOF,那將永遠循環。 它應該是:
while ( (msg = in.readLine()) != null);
請參閱BufferedReader.readLine()
的 javadoc,特別注意它返回null
的條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.