0

クライアントからの TCP ソケット接続を受け入れるこの単純なサーバーがあります。TCPConnectionHandler接続を試みる各クライアントは、新しい Socket を使用して独自のインスタンスを取得します。クライアントの切断をどのように処理すればよいかわかりません。これが私のものTCPConnectionHandlerです:

    @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()ます。最初は、クライアントが切断されたときに取得されるオブジェクトInputStreamから取得されると考えていました。ただし、この例外をキャッチできませんでした。クライアントが切断されたときに実際に何が起こり、上記のスニペットに関連してそれを正しくキャッチするにはどうすればよいですか? SocketnullNullPointerExceptionBufferedReaderreadLine()

4

1 に答える 1

1

ループ条件が間違っています。クライアントが切断すると、空の文字列ではなく nullreadLine()が返されます。したがって、現在のループは、きれいに終了する代わりに a をスローします。NullPointerException

さらに、try-block に catch フェーズを追加するだけです。

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

その後、すべてが大丈夫になります。

于 2013-09-25T09:26:25.097 に答える