NIO编程中,报“远程主机强迫关闭了一个现有的连接”IOException

Java NIO聊天室 中,若客户端强制关闭,服务器会报“Java.io.IOException: 远程主机强迫关闭了一个现有的连接。”,并且服务器会在报错后停止运行,错误的意思就是客户端关闭了,但是服务器还在从这个套接字通道读取数据,便抛出IOException,导致这种情况出现的原因就是,客户端异常关闭后,服务器的选择器会获取到与客户端套接字对应的套接字通道SelectionKey,并且这个key的兴趣是OP_READ,执行从这个通道读取数据时,客户端已套接字已关闭,所以会出现“java.io.IOException: 远程主机强迫关闭了一个现有的连接”的错误。解决这种问题也很简单,就是服务器在读取数据时,若发生异常,则取消当前key并关闭通道.

解决方法是取消这个关系Selectionkey ;并把这个管道的socket连接关闭

key.cancel();
channel.socket().close();

代码如下:
 

try {
    write = channel.read(buffer);
} catch (IOException e) {
    key.cancel(); //取消这个关系Selectionkey 
    channel.socket().close();  //管道的socket连接关闭
    //e.printStackTrace();
}

在监听这个SelectionKey的事件时,先判断这个key是否有效,客户端断开连接后取消掉这个key。

NIO编程中,报“远程主机强迫关闭了一个现有的连接”IOException_第1张图片

你可能感兴趣的:(NIO编程,NIO网络编程,socket)