论坛首页 Java企业应用论坛

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

浏览 11304 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-17  

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

   发表时间:2012-10-18  
no way,客户端会乖乖的调close方法吗?

比如杀进程之类。
0 请登录后投票
   发表时间:2012-10-18  
eisenwolf 写道
no way,客户端会乖乖的调close方法吗?

比如杀进程之类。


一般我们服务器和客户端都是自己写的代码,你不按照要求写,又没有办法。
0 请登录后投票
   发表时间:2012-10-18  
鸡肋。。客户端既然能关闭,服务器端也不会考虑这个抛异常了。直接客户端增加一条断开的协议就行了。
主要就是客户端无法控制,比如,断网线,客户端为手机,直接关应用。。。
顶2楼。。。
1 请登录后投票
   发表时间:2012-10-18  
java&java 写道
鸡肋。。客户端既然能关闭,服务器端也不会考虑这个抛异常了。直接客户端增加一条断开的协议就行了。
主要就是客户端无法控制,比如,断网线,客户端为手机,直接关应用。。。
顶2楼。。。


楼上正解,这个异常一般大多都是非正常关闭导致的。你这没有任何意义~~
0 请登录后投票
   发表时间:2012-10-18  
lz不打算catch这个异常吗?

如果要catch这个异常的话,直接在异常中处理就得了,鸡肋
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics