NIO-selector选择器(七)
发布日期:2021-04-30 21:03:38 浏览次数:91 分类:精选文章

本文共 1358 字,大约阅读时间需要 4 分钟。

Selector 是 Java NIO(非阻塞输入/输出)中用于管理多路复用器(Selector)的核心组件。它的主要作用是监控多路复用器上注册的多个通道(如文件描述符、套接字等)的事件状态,并根据事件类型执行相应的处理逻辑。

工作流程

在 Java NIO 中,Selector 的工作流程可以分为以下几个关键步骤:

  • 初始化多路复用器:通过 Selector.open() 方法创建一个 Selector 对象,这个对象用于管理多个通道。
  • 注册通道:将需要监控的输入/输出通道(如套接字、文件描述符等)注册到 Selector 对象中。
  • 设置非阻塞模式:将通道设置为非阻塞模式(通过 serverSocketChannel.configBlocking(false)),以便多路复用器能够高效地处理大量事件。
  • 绑定和监听:将通道绑定到特定的地址(如 IP 地址和端口),并将其注册到多路复用器上,开始监听事件。
  • 执行选择操作:调用 selector.select() 方法,使多路复用器变为阻塞状态,等待有事件要处理的通道。
  • 轮询事件:根据多路复用器返回的结果,轮询各个通道的事件类型(如连接事件、可读事件、可写事件等),并根据事件类型执行相应的业务逻辑。
  • 案例

    服务端配置

  • 创建多路复用器

    通过 Selector.open() 创建一个 Selector 对象,用于管理多个通道。

  • 创建服务端套接字并设置非阻塞

    使用 ServerSocketChannel 类创建服务端套接字,并通过 configBlocking(false) 将其设置为非阻塞模式。

  • 绑定端口并注册多路复用器

    将服务端套接字绑定到指定的 IP 地址和端口(如 InetSocketAddress("localhost", 8080")),并将其注册到多路复用器上。

  • 设置阻塞并监听连接事件

    将多路复用器设置为阻塞状态,并在 selector.select() 方法上执行。然后,通过轮询多路复用器中的事件键(key),判断事件类型:

    • 连接事件(ConnectionEvent):表示有新的客户端连接请求。
    • 可读事件(ReadableEvent):表示客户端通过套接字发送了数据。
  • 处理客户端事件

    遍历多路复用器中的事件键,并处理相应事件。例如:

    • 当检测到连接事件时,获取客户端的连接通道,并将其设置为非阻塞模式。
    • 当检测到可读事件时,从客户端读取数据并进行处理。
    • 需要注意的是,应从多路复用器中删除已处理的事件键,避免重复处理。
  • 客户端配置

  • 打开多路复用器

    使用 Selector.open() 创建一个 Selector 对象。

  • 创建客户端并连接服务端

    使用 SocketChannel.open() 创建客户端套接字,并指定连接目标地址(如 InetSocketAddress("localhost", 8080"))。

  • 注册连接事件

    将客户端套接字注册到多路复用器上,等待连接事件。

  • 轮询多路复用器事件

    selector.select() 方法上执行,判断事件类型:

    • 连接事件(ConnectionEvent):表示服务端已接受客户端连接请求。
  • 处理连接事件

    获取客户端的连接通道,并执行后续操作(如数据读写)。

  • 上一篇:【剑指offer】面试题42:连续子数组的最大和(java)
    下一篇:剑指offer打卡Day12:数组中重复的数字

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2026年05月25日 18时50分53秒