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