NIO的SelectableChannel关闭的一个问题
来源:互联网 发布:使命召唤12i5优化补丁 编辑:程序博客网 时间:2024/06/09 19:52
ocketChannel和ServerSocketChannel,两者的父类是SelectableChannel,它在jdk中的文档有这么段话:
Once registered with a selector, a channel remains registered until it is deregistered.This involves deallocating whatever resources were allocated to the channel by the selector.
A channel cannot be deregistered directly; instead, the key representing its registration must be cancelled. Cancelling a key requests that the channel be deregistered during the selector's next selection operation.
也就是说关闭一个已经注册的SelectableChannel需要两个步骤:
1)取消注册的key,这个可以通过SelectionKey.cancel方法,也可以通过SelectableChannel.close方法,或者中断阻塞在该channel上的IO操作的线程来做到。
2)后续的Selector.selectXXX方法的调用才真正地关闭本地Socket。
因而,如果,如果在取消SelectionKey后没有调用到selector的select方法(因为Client一般在取消key后, 我们都会终止调用select的循环,当然,server关闭一个注册的channel我们是不会终止select循环的),那么本地socket将进入CLOSE-WAIT状态(等待本地Socket关闭)。简单的解决办法是在 SelectableChannel.close方法之后调用Selector.selectNow方法,类似:
Selector sel;
SocketChannel sch;
// …
sch.close();
sel.selectNow();
- NIO的SelectableChannel关闭的一个问题
- java的nio包的SelectionKey,Selector,SelectableChannel三者的缠绵关系概述
- 《Java源码解析》之NIO的Selector机制(Part2:SelectableChannel.register(Selector sel, int ops))
- 【转载】NIO-SelectableChannel
- 一个Java NIO问题引发的思考
- 遇到一个比较有意思的NIO问题!
- 示范SelectableChannel的阻塞和非阻塞网络编程
- 一个TCP连接关闭的问题
- 一个简单的recordset对象关闭问题
- NIO存在的问题
- tcp nio 远程主机强迫关闭了一个现有的连接
- Java NIO服务器:远程主机强迫关闭了一个现有的连接
- Java NIO服务器:远程主机强迫关闭了一个现有的连接
- JAVA NIO导致JAVA服务端程序无法关闭的奇怪问题
- 一个简单的NIO实例
- 一个关于NIO的分析
- Java NIO之Selector类与SelectableChannel类
- 判断IE的关闭按钮的一个问题
- web.config文件详解及对web.config的理解和应用
- asp.net web 打印功能
- 联通3G非定制机的上网设置
- Web.config编码设置(中文)
- using的用法
- NIO的SelectableChannel关闭的一个问题
- 《Windows程序调试(Debugging Windows Programs)》读书笔记(一)
- Hibernate中的JAVA对象有三种状态
- 用千千静听制作一张自动播放的光盘
- 用JFig管理配置文件
- 转换
- 闪字效果代码
- 中文与acsii码相互转换方法
- Java常用包以及String类,函数的调用