浏览 11298 次
精华帖 (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); 如果服务器没有client.close,则一直System.out.println(count)
所以先客户端调用close,然后服务器在read事件里面读取返回是不是-1,如果是,调用服务器这边客户端的引用的close方法,这样两边的SocketChannel都关闭了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-10-18
no way,客户端会乖乖的调close方法吗?
比如杀进程之类。 |
|
返回顶楼 | |
发表时间:2012-10-18
eisenwolf 写道 no way,客户端会乖乖的调close方法吗?
比如杀进程之类。 一般我们服务器和客户端都是自己写的代码,你不按照要求写,又没有办法。 |
|
返回顶楼 | |
发表时间:2012-10-18
鸡肋。。客户端既然能关闭,服务器端也不会考虑这个抛异常了。直接客户端增加一条断开的协议就行了。
主要就是客户端无法控制,比如,断网线,客户端为手机,直接关应用。。。 顶2楼。。。 |
|
返回顶楼 | |
发表时间:2012-10-18
java&java 写道 鸡肋。。客户端既然能关闭,服务器端也不会考虑这个抛异常了。直接客户端增加一条断开的协议就行了。
主要就是客户端无法控制,比如,断网线,客户端为手机,直接关应用。。。 顶2楼。。。 楼上正解,这个异常一般大多都是非正常关闭导致的。你这没有任何意义~~ |
|
返回顶楼 | |
发表时间:2012-10-18
lz不打算catch这个异常吗?
如果要catch这个异常的话,直接在异常中处理就得了,鸡肋 |
|
返回顶楼 | |