21xrx.com
2024-12-23 03:21:03 Monday
登录
文章检索 我的文章 写文章
Java实现NIO非阻塞网络编程
2023-06-13 02:17:09 深夜i     --     --
Java NIO 非阻塞

我最近在学习Java的NIO(Non-blocking IO)相关知识,想与大家分享一下我的学习笔记。

首先我创建了一个非阻塞的ServerSocketChannel,代码如下:

 java

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.configureBlocking(false);

serverSocketChannel.socket().bind(new InetSocketAddress(port));

如上代码中,我们通过调用`.open()`方法创建了一个ServerSocketChannel实例,并通过调用`.configureBlocking(false)`设置为非阻塞模式。最后通过调用`.socket().bind()`方法绑定端口。

接着我们需要创建一个Selector实例,用于监听感兴趣的事件:

 java

Selector selector = Selector.open();

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

如上代码中,我们通过调用`Selector.open()`方法创建了一个Selector实例,并通过调用`register()`方法将我们刚才创建的ServerSocketChannel注册到Selector中,表示我们对`OP_ACCEPT`事件感兴趣。

最后,我们通过Selector监听感兴趣的事件并处理:

 java

while(true) {

  int readyChannels = selector.select();

  if(readyChannels == 0) continue;

  Set selectedKeys = selector.selectedKeys();

  Iterator keyIterator = selectedKeys.iterator();

  while(keyIterator.hasNext()) {

    SelectionKey key = keyIterator.next();

    if(key.isAcceptable())

      // 处理连接请求

     else if (key.isReadable())

      // 处理读事件

     else if (key.isWritable())

      // 处理写事件

    

    keyIterator.remove();

  }

}

如上代码中,我们首先通过调用`selector.select()`方法获取已经就绪的Channel数量,如果没有就绪的Channel则跳过本次循环;否则通过调用`selector.selectedKeys()`方法获取已经就绪的SelectionKey集合,并进行处理。

以上就是我对Java实现NIO的学习笔记,希望对想学习NIO的同学们有所帮助。三个

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复