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。