当客户端直接断开连接时,服务器端会报错如下:
定位到出错的地方
客户端在断开连接时,服务端会触发一个read事件。
但是服务器不知道这个read事件是普通的read,还是代表客户端已经断开连接的read,所以在尝试读取的时候抛出了异常。
为了保持服务端继续运行,我们不能直接抛出异常,而应该捕捉异常并就地处理。
比如这么做:
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
try {
readBuffer.clear();
int read = socketChannel.read(readBuffer);
if(read > 0) {
readBuffer.flip();
String receiveData = StandardCharsets.UTF_8.decode(readBuffer).toString();
System.out.println("收到客户端消息: " + receiveData);
writeBuffer.clear();
writeBuffer.put(receiveData.getBytes(StandardCharsets.UTF_8));
writeBuffer.flip();
socketChannel.write(writeBuffer);
}
}catch (Exception e) {
try {
socketChannel.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
System.out.println("客户端断开了连接~~");
count--;
}
完整的代码可以看另一篇博客: java nio简单示例:实现客户端与服务器一问一答 (异常处理,见server端的readHandle方法)