nio编程过程中会出现:
Exception in thread "main" java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207)
at com.rb.socket.nio.server.n.NIOServer.handleKey(NIOServer.java:87)
at com.rb.socket.nio.server.n.NIOServer.listen(NIOServer.java:57)
at com.rb.socket.nio.server.n.NIOServer.main(NIOServer.java:122)
主要原因是:客户端自己关闭了连接(没有调用SocketChannel的close方法),服务器还在read事件中,这个时候读取客户端的时候会报错。
解决办法,在客户端合适的时候,调用SocketChannel的close方法,同时服务器读取事件增加如下逻辑:
count = client.read(receivebuffer);
if(count==-1){
System.out.println(count);
client.close();
} else {
如果服务器没有client.close,则一直System.out.println(count)
所以先客户端调用close,然后服务器在read事件里面读取返回是不是-1,如果是,调用服务器这边客户端的引用的close方法,这样两边的SocketChannel都关闭了。