NIO Selector

一、NIO Selector的定义和作用

Java NIO(New IO)是从Java 1.4版本开始引入的,用于替代原来的Java IO API,NIO提供了一种面向缓冲区的、基于通道的I/O操作方式。NIO中的Selector其实是一个选择器,用于处理多个通道的选择性IO操作。以前,一个线程只能处理一个连接,而Selector提供了一种可以通过一个线程处理多个连接的方式。

在使用NIO编程时,Selector负责监控被注册进它里面的Channel,当Channel中有可以进行IO操作的状态时,Selector将会得到通知,进行相应的处理,而不需要线程一直轮询。因此,NIO Selector解决了Java BIO的瓶颈问题,保证了处理高并发连接时系统性能和可靠性的平衡。

二、NIO Selector的基本使用方法

下面给出一个简单的例子来说明如何使用NIO Selector实现服务端与客户端的简单通信:

    Selector selector = Selector.open();
    ServerSocketChannel serverSocket = ServerSocketChannel.open();
    serverSocket.bind(new InetSocketAddress(8080));
    serverSocket.configureBlocking(false);
    SelectionKey selectionKey = serverSocket.register(selector, SelectionKey.OP_ACCEPT);
    while (true) {
        selector.select();
        Set<SelectionKey> selectionKeys = selector.selectedKeys();
        Iterator<SelectionKey> iterator = selectionKeys.iterator();
        while (iterator.hasNext()) {
            SelectionKey key = iterator.next();
            if (key.isAcceptable()) {
                ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
                SocketChannel socketChannel = serverSocketChannel.accept();
                socketChannel.configureBlocking(false);
                socketChannel.register(selector, SelectionKey.OP_READ);
                System.out.println("建立链接");
            } else if (key.isReadable()) {
                SocketChannel socketChannel = (SocketChannel) key.channel();
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                socketChannel.read(buffer);
                String receive = new String(buffer.array());
                System.out.println("接收到客户端的信息:" + receive);
            }
            iterator.remove();
        }
    }

上述代码中,我们首先创建一个Selector实例并打开一个ServerSocketChannel,然后将ServerSocketChannel注册到Selector上,并且声明该Selector对客户端连接请求(OP_ACCEPT)感兴趣。

最后通过不断地轮询select()方法,来检查是否有连接已经准备好进行I/O操作。在select()方法返回之后,我们通过迭代器获取可操作的SelectionKey集合,然后进行相应操作,例如建立连接或者从通道中读取数据。

三、NIO Selector的优缺点

NIO Selector有以下几个优点:

1、单线程可以处理多个连接,降低了系统开销,提高了系统的伸缩性;

2、为非阻塞I/O提供了一个优良的基础,Selector监听多个Channel的I/O事件的能力使得单个线程可以处理多个并发通道,从而提高了系统的并发处理能力;

3、提供了更高效的事件通知机制。当向Selector注册Channel时,可以指定我们感兴趣的操作类型(Connect、Accept、Read、Write),只有在这些事件发生时,Selector才会返回,否则就一直阻塞。这样,我们就可以用一个线程去管理多个channel,也就是NIO实现高效的处理方式的基础;

但同时,NIO Selector也有以下几个缺点:

1、对于连接的管理较为复杂,且处理细节需要高度注意;

2、编程较为繁琐,需要一定的经验和能力;

3、自己编写网络框架时,使用NIO Selector需要考虑到众多细节问题,涉及到多线程、使用ByteBuffer等方面;

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/286804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-23 03:48
下一篇 2024-12-23 03:48

相关推荐

  • Selector选择器的作用和用法

    一、Selector选择器的概念 在HTML和CSS中,选择器是一种模式,用于选择要在网页上进行样式处理或操作的元素。HTML中的选择器可以被用来选择重要的HTML元素,比如:表单…

    编程 2025-01-16
  • Java IO 和 NIO的区别

    Java有两种不同的输入输出API,分别是IO(Input/Output)和NIO(New Input/Output)。虽然两者都提供了对文件和网络操作的支持,但在很多方面有很大不…

    编程 2025-01-04
  • java复制文件nio复制多个文件,java复制一个文件

    本文目录一览: 1、java复制文件夹以及其中的文件 2、java如何拷贝一个文件夹内的多个指定的文件到另外一个指定的文件夹下? 3、java中复制文件的两种方法是什么 4、jav…

    编程 2024-12-24
  • java的io,java的io是面向流的,nio是面向块的

    本文目录一览: 1、Java中的io流关闭问题 2、看了mars老师的java视频,关于io的输入输出遇到问题了,请高手指点指点 3、Java中IO缓冲区的原理是什么 4、Java…

    编程 2024-12-22
  • java当中的nio框架(java nio的使用场景)

    本文目录一览: 1、有人能说清楚JAVA7 NIO NETTY IOCP之间的联系吗 2、为什么说Java NIO 是非阻塞的 3、java nio 服务器架构有哪些 4、java…

    编程 2024-12-16
  • Java.nio.BufferUnderflowException异常详解

    Java是一种广泛使用的编程语言,它的高性能和可移植性使它成为现代软件开发的首选编程语言之一。然而,在Java开发过程中,我们难免会遇到一些异常情况。本文将重点介绍Java中的缓冲…

    编程 2024-12-15
  • Java NIO中的ByteBuffer在Android开发中的高效使用

    在Android开发中,ByteBuffer是一个重要的类,它是Java NIO(New IO)中的一部分,可帮助您以一种高效,非阻塞的方式读取和写入数据。在本文中,我们将探讨如何…

    编程 2024-12-12
  • NIO是什么?

    一、NIO是什么意思? NIO是英文New I/O的缩写,全称为New Input/Output。这是Java提供的一套新的输入/输出机制,用于替代在标准I/O上所采用的面向字节的…

    编程 2024-12-12
  • java使用nio拷贝大文件,java nio 复制文件

    本文目录一览: 1、在Java 7中如何对文件进行操作 2、java 怎么提高文件拷贝迁移效率nio 3、使用Java语言如何实现快速文件复制 4、怎样用java程序实现文件拷贝 …

    编程 2024-12-12
  • Python Selector详解

    Python Selector是一款强大的虚拟主机环境下的Python版本管理工具。它可以帮助用户在同一个虚拟主机下运行多个Python版本,并让用户在应用程序中切换Python解…

    编程 2024-12-12

发表回复

登录后才能评论