1、原理分析
NIO
非阻塞网络编程相关的(Selector
、SelectionKey
、ServerScoketChannel
和SocketChannel
) 关系梳理图:
对上图的说明:
-
当客户端连接时,会通过
ServerSocketChannel
得到SocketChannel
; -
Selector
进行监听select
方法, 返回有事件发生的通道的个数; -
将
socketChannel
注册到Selector
上,register(Selector sel, int ops)
, 一个selector
上可以注册多个SocketChannel
; -
注册后返回一个
SelectionKey
, 会和该Selector
关联(集合); -
进一步得到各个
SelectionKey
(有事件发生); -
在通过
SelectionKey
反向获取SocketChannel
, 方法channel()
; -
可以通过 得到的
channel
, 完成业务处理.
2、案例
服务器端:
package com.dult;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
public class NIOServer {
public static void main(String[] args) throws Exception{
//创建 ServerSocketChannel -> ServerSocket
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//得到一个 Selecor 对象
Selector selector = Selector.open();
//绑定一个端口 6666, 在服务器端监听
serverSocketChannel.socket().bind(new InetSocketAddress(6666));
//设置为非阻塞
serverSocketChannel.configureBlocking(false);
//把 serverSocketChannel 注册到 selector 关心 事件为 OP_ACCEPT
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//循环等待客户端连接
while (true) {
//这里我们等待 1 秒,如果没有事件发生, 返回
if(selector.select(1000) == 0) {
//没有事件发生
System.out