`

nio 远程主机强迫关闭了一个现有的连接 解决方案

 
阅读更多

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都关闭了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics