当前位置:网站首页>NIO's Selector execution process
NIO's Selector execution process
2022-08-02 21:04:00 【i attack siege lion】
一、Seletor是什么?
selector 单从字面意思不好理解,Seletor是一个监听器,它可以监听Channel中发生的事件.Channelcan be registered atSeletor中,when these are registeredChannel在事件发生时,Seletor的select 方法就会返回这些事件交给 thread 来处理.
二、Seletordifference from multithreading
It is not easy to understand just from the above explanation,需要结合服务器的设计演化来理解它的用途
多线程版设计
to clients in the networksocket请求,If each request opens a thread to handle,Then the system memory usage is high,Thread context switching costs are also high,The stress on the system can be very high.
线程池版设计
使用线程池,Optimized thread creation,But in blocking mode,线程仅能处理一个 socket 连接, 仅适合短连接场景
selector版本
selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上.适合连接数特别多,但流量低的场景(low traffic)

三、selector单线程处理多socket案例
服务端代码:
@Slf4j
public class ChannelDemo6 {
public static void main(String[] args) {
try (ServerSocketChannel channel = ServerSocketChannel.open()) {
channel.bind(new InetSocketAddress(8080));
System.out.println(channel);
Selector selector = Selector.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
int count = selector.select();
log.debug("select count: {}", count);
// 获取所有事件
Set<SelectionKey> keys = selector.selectedKeys();
// 遍历所有事件,逐一处理
Iterator<SelectionKey> iter = keys.iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
// 判断事件类型
if (key.isAcceptable()) {
ServerSocketChannel c = (ServerSocketChannel) key.channel();
// 必须处理
SocketChannel sc = c.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
log.debug("连接已建立: {}", sc);
}
else if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(128);
int read = sc.read(buffer);
if(read == -1) {
key.cancel();
sc.close();
} else {
buffer.flip();
debugAll(buffer);
}
}
// 处理完毕,必须将事件移除
iter.remove();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8080)) {
System.out.println(socket);
socket.getOutputStream().write("world".getBytes());
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法解释:
- ServerSocketChannelused to create the serverChannel,它有点像ServerSocket.
- channel.configureBlocking(false);设置channel为非阻塞,这样如果accpet的时候,如果没有连接,就会返回null.
- channel.register(selector, SelectionKey.OP_ACCEPT)将channel注册到selector中,监听accept连接事件
- selector.select(),会阻塞,等待客户端连接
- selector.selectedKeys(),event production,will add events to this collection
四、selector事件
- accept Fired when a connection is made
- connect Fired when a client establishes a connection
- read Raises a readable event when a client message is received
- 可写事件
边栏推荐
- NIO基础之三大组件
- 载20(S)-人参皂苷/细胞穿膜肽-单克隆抗体-载丝裂霉素白蛋白纳米微球的制备
- Smart Microelectronics Releases Low-Power MM32L0130 Series MCU Products
- 深入理解IO流(第一篇)
- pydev debugger: warning: trying to add breakpoint to file that does not exist: /tmp/xxx
- How a "cloud" can bring about new changes in the industry
- MySQL基本语法
- 如何确保智能工厂的安全?
- LeetCode 1947. 最大兼容性评分和(状态枚举DP)
- From the technical panorama to the actual scene, analyze the evolutionary breakthrough of "narrowband high-definition"
猜你喜欢

【秒杀办法】根据二叉树的先序遍历、中序遍历、后序遍历快速创建二叉树

开源一夏 | Web开发(七):登录实现及功能测试

固态硬盘接口类型介绍

力扣 622. 设计循环队列

Functional test points for time, here is a comprehensive summary for you

Playing in the cloud | The key technology of Tianyi cloud object storage ZOS high availability is revealed

MySQL基本语法

sed 命令

“12306”的架构到底有多牛逼?

监控易火星版即将亮相:分布式运维帮助TOP3000大企业跨越管理鸿沟
随机推荐
HDF驱动框架的API(2)
golang刷leetcode动态规划(9)不同路径 II
redis总结_基础
洛谷P2345 MooFest G
进程与线程
宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码
C#里如何简单的校验时间格式
54.【system系统互动函数大总结】
「日志」深度学习 CUDA环境配置
golang刷leetcode 经典(1) LRU缓存机制
Openharmony - 基于ArkUI(TS)开发颜色选择器
Playing in the cloud | The key technology of Tianyi cloud object storage ZOS high availability is revealed
How to ensure the security of smart factories?
[深入研究4G/5G/6G专题-49]: 5G Link Adaption链路自适应-5-上行链路自适应ULLA-PUSCH信道
Technical life | How to draw a big picture of business
多聚体/壳聚糖修饰白蛋白纳米球/mPEG-HSA聚乙二醇人血清白蛋白纳米球的制备与研究
arcgis 分子式标注
golang刷leetcode 经典(4) 实现跳表
Endanger the safety of common Internet attacks have?
MySQL基本操作和基于MySQL基本操作的综合实例项目