2013-09-25 314 views
0

我有這個接受來自客戶端的TCP套接字連接的簡單服務器。每個嘗試連接的客戶端都使用新的Socket獲取自己的實例TCPConnectionHandler。我不明白我應該如何處理客戶端斷開連接。這裏是我的TCPConnectionHandler處理TCP客戶端斷開連接

@Override 
    public void run() { 
    try { 
     br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     String line; 

     while (!(line = br.readLine()).isEmpty()) { 

      Message messageObj = Tools.JSON2Message(line); 
      messageObj.setSourceIP(socket.getInetAddress().toString().substring(1)); 

      logger.info("TCPCH: Message received from: " + messageObj.getSourceIP() + ". Type of message: " + messageObj.getClass().getSimpleName()); 

      Message response; 
      if (messageObj instanceof HandshakeReq) { 
       response = new HandshakeHandler(requestRouter.getTabletCollection()).handleRequest((HandshakeReq) messageObj, this); 
      } else { 
       response = requestRouter.routeAndHandleRequest(messageObj); 
      } 

      if (response != null) 
       sendMessageTCP(response); 

     } 

    } catch (IOException e) { 
     logger.error("TCPConnectionHandler failed: " + e.getCause()); 
     e.printStackTrace(); 
    } 

} 

現在,當一個客戶端斷開連接,我得到NullPointerException這可追溯到run()方法。在開始我認爲它是InputStreamSocket對象得到,當客戶端斷開時變爲null,當BufferedReader調用readLine()時,我得到NullPointerException。儘管如此,我無法理解這個例外。客戶斷開連接時究竟發生了什麼,我應該如何正確捕獲與上述代碼段有關的內容?

+0

你在哪裏有NullPointerException?或者只是給堆棧跟蹤 –

回答

1

您的循環條件錯誤。如果客戶端斷開連接,readLine()將返回空,不是空字符串。因此,您現在的循環將拋出一個NullPointerException而不是乾淨地退出。

此外,只需在try-block中添加更多catch階段。

catch (NullPointerException ex) { 
    socket.close() 
} 

那麼一切都會好起來的。