2014-08-27 39 views
0

我正在寫一個多線程服務器,它目前只是收到一個字符串並將其發回大寫。檢測關閉的套接字

我的問題是,服務器不檢測何時與客戶端的連接丟失,並且客戶端處理程序線程因此保持運行。

我有一個處理客戶端請求的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) 

但是,這是不工作...

任何建議將不勝感激。

+0

我不認爲你可以,這就是爲什麼一些協議(如IRC)定期ping他們的客戶端,並等待超時回答。 – Djon 2014-08-27 12:37:45

+0

'Socket.isClosed()'檢測到一個關閉的*套接字*,但是你真正要問的是一個關閉的*連接*,由對等關閉。 @ jtahlborn的答案是正確的。 – EJP 2014-08-27 12:55:00

回答

1

Socket.isClosed()只會返回true,如果已關閉插座。您檢測到連接已被同行關閉的方式是通過讀取它。您不應該使用in.available()。相反,只需從套接字中讀取,當套接字關閉時您將得到一個異常。

+0

謝謝。我知道即使連接丟失,isClosed也會保持爲True。我的計劃是,如果發現連接丟失,請從循環內部進行檢查,以進行clientSocket.close()調用。 – Zahrec 2014-08-27 15:45:00