代码如下:
// 反复循环,等待IO
while (true) {
// 等待某信道就绪(或超时)
if (selector.select(TimeOut) == 0) {// 监听注册通道,当其中有注册的 IO
// 操作可以进行时,该函数返回,并将对应的
// SelectionKey 加入 selected-key
// set
log.info("服务器独自等待.");
continue;
}
// 取得迭代器.selectedKeys()中包含了每个准备好某一I/O操作的信道的SelectionKey
// Selected-key Iterator 代表了所有通过 select() 方法监测到可以进行 IO 操作的 channel
// ,这个集合可以通过 selectedKeys() 拿到
Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
while (keyIter.hasNext()) {
SelectionKey key = keyIter.next();
try {
if (key.isAcceptable()) {
// 有客户端连接请求时
protocol.handleAccept(key);
}
if (key.isReadable()) {// 判断是否有数据发送过来
// 从客户端读取数据
protocol.handleRead(key);
}
if (key.isValid() && key.isWritable()) {// 判断是否有效及可以发送给客户端
// 客户端可写时
protocol.handleWrite(key);
}
} catch (IOException ex) {
// 出现IO异常(如客户端断开连接)时移除处理过的键
log.error("IO异常(如客户端断开连接)", ex);
keyIter.remove();
continue;
}
// 移除处理过的键
keyIter.remove();
}
}
奇怪的现象是,我关闭了客户端后,这个keyIter里面一直会有一个read的key存在,按说客户端关闭了应该阻塞了,很奇怪。