nio中的关键是selecter,这是一个选择器,从代码来看实际上就是一个列表,一个包含SelectionKey的阵列,而一个SelectionKey对应于一个通道
当我们使用this.selector.select();方法,如果有通道在通讯,那么就会有通道写入selecter选择器中.select从阻塞的状态变为执行,后面的代码才会执行,同时在selecter列表中会加入
已就绪的通道.然后我们一个一个通首的进行处理.
this.selector.select();
Iterator selectorKeys = this.selector.selectedKeys().iterator();
selectorKeys 类型中的属性也没有什么,其实也就是一个通道和一个Object类型,通道代表注册的通道,也就是和通道关联的是那个通道,所有的通道一般都继承
public abstract SelectableChannel channel();
而有一个属性为Object可以绑定任何类型对象.
很显示客户连接服务器时,这时通道会触发事件,然后会向selector写入自己对应的SelectionKey并置相应的操作状态,selecter在select时发现列表有数据后会停止阻塞向下执行.
因此selecter其实就是不段的循环看看是selectorKeys 列表是否有东西,如果没有就阻塞,如果有就开始处理selectorKeys直到列表为零为至,然后继续阻塞.
网友评论