NIO学习之Selector,SelectionKey与客户端与服务端通信简单实现(1)

本文介绍了NIO中的Selector和SelectionKey,讲解了它们的主要作用和方法,包括Selector的select()、wakeup()和close(),以及SelectionKey的interestOps()。通过实例展示了如何在服务端和客户端使用这些概念进行通信,帮助理解NIO的事件驱动模型。
摘要由CSDN通过智能技术生成

选择器(Selector)的 作用:将通道感兴趣的事件放入队列中,而不是马上提交给应用程序,等已注册的通道自己来请求处理这些事件。换句话说,就是选择器将会随时报告已经准备好了的通道,而且是按照先进先出的顺序。

Selector类定义如下:
这里写图片描述

open()方法, 静态方法,用于获取1个Selector对象

keys()方法,用于获取所有注册到Selector对象上的SelectionKey

selectedKeys()方法,用于获取已注册通道发出的准备好了的SelectionKey

select()方法,调用此方法的线程会一直阻塞,直到注册的通道中关注的事件发生了才会返回。 例:服务端的ServerSocketChannel 注册了OP_ACCEPT事件,如果没有客户端连接服务端,那么服务端将一直阻塞在调用select()方法的地方

select(long)方法,此方法与不带参数的差不多,参数的含义是当阻塞的时间超过给定的时间参数,该方法将返回继续执行

wakeup()方法,会唤醒当前被阻塞的线程,使其 select() 立即返回;如果当前线程没有阻塞,那么执行了wakeUp() 方法之后,下一个线程的 select() 方法会被立即返回,不再被阻塞下去

close()方法,能够关闭当前的选择器。当一个线程当前呈阻塞状态,那么中止这种状态需要先调用Selector的 wakeUp() 方法。close()方法在实现类中先调用wakeUp()方法唤醒被阻塞的线程,然后置空所有的通道、所有就绪的SelectionKey,让这个选择器上的轮询组件也闲置下来。


选择键(SelectionKey)的作用是表明哪个通道已经做好了相应的准备,相应的准备指SelectionKey类里定义的OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT中某个某个事件发生了。Selector不断轮询是否有事件准备好了,如果有事件准备好了则获取事件相应的SelectionKey,进入事件处理

SelectionKey定义如下:
这里写图片描述

SelectionKey主要说两点:
attach(Object)主要用于绑定一个对象( 对象可以任意类型),绑定后可以在不同线程间共享,对应的 attachment()方法用于获取绑定的对象

interestOps()方法用于获取通道“感兴趣”的操作或事件


说了SelectorSelectionKey 的基础知识及主要方法的使用,现在就来实践一下。


服务端
伪代码

1.打开1个ServerSocketChannel通道
2.把ServerSocketChannel设置为非阻塞的
3.为ServerSocketChannel通道绑定ip地址与端口
4.获取Selector对象
5.把ServerSocketC
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值