熟悉NIO,首先要理解NIO核心对象
ServerSocketChannel
Selector:是一个多路开关选择器,可以同时检查(如果需要,也可以等待)一组信道的I/O状态,能够管理多个信道上的I/O操作。
简单NIO服务端为例实现逻辑:
创建Selector(多路开关选择器或者通道管理器),
(干的事就是收集请求,分发任务)。
需要下列连个核心对象
ServerSocketChannel: 通信信道
SelectionKey:对应信道上匹配并可以处理的哪种事件(包含四种枚举事件)
Selector实例对象设置: (规定好要监听报告的事件,这个只监听新连接事件)
1 开启一个服务端的信道:
ServerSocketChannel ssc = ServerSocketChannel.open();
2 绑定socket端口ssc.socket().bind
3 注册绑定Selector 到信道,将Selector实例(Selector.open()获取)注册(register 1:n)到想要监控的信道上
serverSocketChannel.register(connectionBell.getSelector(), SelectionKey.OP_ACCEPT);
(注意, 这要通过channel的方法实现,而不是使用selector的方法)
4 开启Selector监控连接专用线程(内部while(true)自旋)
new Thread(connectionBell).start();
5 专用线程内部可以做的事:
服务端Selector实例内核轮询 获取信道事件,this.selector.select();该方法阻塞等待或者超时
通过信道事件找到对应信道,获取该信道及客户端请求信息
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
开启多线程:dispatch分发处理请求
6 客户端NIO序列图
7 服务端NIO序列图