簡體   English   中英

服務器未實現 Java/android socket.close()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM