我正在寫一個多線程服務器,它目前只是收到一個字符串並將其發回大寫。檢測關閉的套接字
我的問題是,服務器不檢測何時與客戶端的連接丟失,並且客戶端處理程序線程因此保持運行。
我有一個處理客戶端請求的while循環,如果連接關閉/ lsot,我願意跳出此循環。
這是該ClientHandler的
try {
inFromServer = clientSocket.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
OutputStream outToServer = clientSocket.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
while(!clientSocket.isClosed()){
if(in.available() > 0) {
String str = in.readUTF(); //Should catch EOF
System.out.println("[+] From " + clientSocket.getInetAddress() + " received: " + str);
String response = str.toUpperCase();
out.writeUTF(response);
}
}
System.out.println("[+] Closing client");
} catch (IOException e) {
e.printStackTrace();
}
我試圖使while循環這樣的代碼:
while(!clientSocket.isClosed() && inFromServer.read() != -1)
但是,這是不工作...
任何建議將不勝感激。
我不認爲你可以,這就是爲什麼一些協議(如IRC)定期ping他們的客戶端,並等待超時回答。 – Djon 2014-08-27 12:37:45
'Socket.isClosed()'檢測到一個關閉的*套接字*,但是你真正要問的是一個關閉的*連接*,由對等關閉。 @ jtahlborn的答案是正確的。 – EJP 2014-08-27 12:55:00