我想在客戶端關閉套接字後關閉TCP連接監聽線程(serverside).. 線程在readLine()中等待循環.. 我該怎麼做?套接字關閉後關閉線程
while(isconnected){
String msg = in.readLine();
//..
}
我想在客戶端關閉套接字後關閉TCP連接監聽線程(serverside).. 線程在readLine()中等待循環.. 我該怎麼做?套接字關閉後關閉線程
while(isconnected){
String msg = in.readLine();
//..
}
也許擴展您的協議,以便客戶端在關閉其套接字之前發送QUIT消息。
您需要中斷該線程。
不起作用。它仍然會在readLine上等待。 – toto2 2012-03-21 23:28:49
@ toto2 - 比這更糟,這個「解決方案」甚至沒有意義。服務器端如何知道客戶端已關閉套接字並且偵聽線程需要中斷? – 2012-03-22 01:16:07
你必須調用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。
更具體地說,該IOException是一個SocketException。 – toto2 2012-03-21 23:36:18
SocketException擴展IOException,但是如果您閱讀文檔BufferedReader中的readLine()拋出「IOException」不是SocketException。就個人而言,我認爲它應該拋出EOFException,這更有意義。 – WalterM 2012-03-21 23:40:02
我的意思是:當你調用'socket.close()'時,它會在'readLine()'的線程中拋出一個SocketException異常。 – toto2 2012-03-21 23:44:43
首先,您不能分辨客戶端是否需要很長時間才能響應,或者是否已關閉。
你可以做的是設置一些超時時間,並在服務器中有一個線程在超時時間後調用clientSocket.close()
。這將在接收線程中拋出一個SocketException。它將帶你離開接收循環,如果接收循環後沒有任何東西,線程將自行終止。
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
}
}
檢查插座仍連接它是多餘的。無論如何,低級套接字讀取將會這樣做。
但是如果客戶端在發送QUIT之前崩潰會發生什麼? – 2012-03-22 01:16:51