求大神来解答一下,java nio 的一些概念

行者爷爷 发布于 2019/03/08 21:51
阅读 145
收藏 0
Selector selector = Selector.open();

channel.configureBlocking(false);

SelectionKey key = channel.register(selector, SelectionKey.OP_READ);


while(true) {

//java nio 用selector来轮询是否有已经注册的事件发生,返回发生多少个,
  int readyChannels = selector.selectNow();

  if(readyChannels == 0) continue;

//如果有事件发生,循环处理
  Set<SelectionKey> selectedKeys = selector.selectedKeys();

  Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

  while(keyIterator.hasNext()) {

    SelectionKey key = keyIterator.next();
//处理就绪状态事件,客户端连接就绪,
    if(key.isAcceptable()) {
        // a connection was accepted by a ServerSocketChannel.

    } else if (key.isConnectable()) {
////这里是连接事件,这可以理解,客户端主动连接,服务端被动处理,
        // a connection was established with a remote server.

    } else if (key.isReadable()) {
//处理读取事件,客户端发送过来的数据需要读取。到这里,上面这三种事件都是客户端主动的行为。
        // a channel is ready for reading

    } else if (key.isWritable()) {
//这里就不理解了,怎么要客户端发来写数据的事件呢?这个事件是不是可以这样理解,客户端告诉服务器,我准备好接收你给我发数据了,你现在可以发数据给我了!难道服务端向客户端发数据还需要客户端通知嘛?
        // a channel is ready for writing
    }

    keyIterator.remove();
  }
}


疑问都写到注释里了,

加载中
0
kakai
kakai

这些事件都是表示tcp channel信道状态的,并不是客户端发送过来的,而是客户端与服务端建立信道后,信道自身状态发生改变的。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部