2012-03-21 191 views
1

我想在客戶端關閉套接字後關閉TCP連接監聽線程(serverside).. 線程在readLine()中等待循環.. 我該怎麼做?套接字關閉後關閉線程

while(isconnected){ 
String msg = in.readLine(); 
//.. 
} 

回答

1

也許擴展您的協議,以便客戶端在關閉其套接字之前發送QUIT消息。

+4

但是如果客戶端在發送QUIT之前崩潰會發生什麼? – 2012-03-22 01:16:51

-1

您需要中斷該線程。

+0

不起作用。它仍然會在readLine上等待。 – toto2 2012-03-21 23:28:49

+0

@ toto2 - 比這更糟,這個「解決方案」甚至沒有意義。服務器端如何知道客戶端已關閉套接字並且偵聽線程需要中斷? – 2012-03-22 01:16:07

3

你必須調用socket.close()方法,如果你正確使用它應該沒問題。我不知道readLine()來自哪裏,所以我將假設它的BufferedReader。如果你在文檔中看這裏BufferedReader readLine()

你會看到它拋出IOException如果有錯誤,並且如果它是流結束它將返回null。

所以你應該基本上做到這一點:

try{ 
    while(socket.isConnected()){ 
    String line = in.readLine(); 
    if(line==null){ 
     //END OF STREAM 
    } 
    } 
}catch(IOException e){ 
    //deal with IOException here 
} 

否則,我認爲你現在做的是儘快另一端斷開坐在一個緊湊的循環。如果你嘗試在上面的代碼中打印出msg,你會看到它打印出不間斷的null。

+0

更具體地說,該IOException是一個SocketException。 – toto2 2012-03-21 23:36:18

+0

SocketException擴展IOException,但是如果您閱讀文檔BufferedReader中的readLine()拋出「IOException」不是SocketException。就個人而言,我認爲它應該拋出EOFException,這更有意義。 – WalterM 2012-03-21 23:40:02

+0

我的意思是:當你調用'socket.close()'時,它會在'readLine()'的線程中拋出一個SocketException異常。 – toto2 2012-03-21 23:44:43

0

首先,您不能分辨客戶端是否需要很長時間才能響應,或者是否已關閉。

你可以做的是設置一些超時時間,並在服務器中有一個線程在超時時間後調用clientSocket.close()。這將在接收線程中拋出一個SocketException。它將帶你離開接收循環,如果接收循環後沒有任何東西,線程將自行終止。

0

WalterM基本上是對的。 readLine調用將返回null流被遠程客戶端關閉,並且如果連接「斷開」而沒有正確關閉,或者低級套接字讀取超時,則會拋出異常。

這是值得指出的是,它更簡單,更高效的只是這樣做:

try { 
    String msg; 
    while ((msg = in.readLine()) != null) { 
     // do stuff 
    } 
} catch (IOException ex) 
    // report error 
} finally { 
    // Close the socket under all circumstances to avoid potential 
    // resource leakage 
    try { 
     socket.close(); 
    } catch (IOException ex) { 
     // ignore 
    } 
} 

檢查插座仍連接它是多餘的。無論如何,低級套接字讀取將會這樣做。