Java New IO
- 基于双向读写通道Channel和缓冲Buffer
- 非阻塞式 (线程处理读写时依然可以非阻塞的做其他事情)
- 选择器Selectors 单个线程用于监听多个通道的事件(连接事件,读取事件等)
Netty框架 通信原理
Java NIO API Demo
Selector感兴趣的事件
SelectionKey.OP_ACCEPT();
SelectionKey.OP_CONNECT();
SelectionKey.OP_READ();
SelectionKey.OP_WRITE();
init()
- 创建Selector对象
Selector selector=Selector.open();
- 创建Channel通道,设置非阻塞
ServerSocketChannel channel=ServerSocketChannel.open();
channel.configureBlocking(false);
- 绑定通道,给上端口
ServerSocket socket=channel.socket();
socket.bind(new InetSocketAddress(port));
- 向Selector中注册感兴趣事件
socket.register(selector,SelectionKey.OP_ACCEPT);
- 处理事件
Listen()
while(true){
- 当注册事件到达时方法返回,否则一直阻塞
selector.select();
- 用迭代器接收注册事件
Iterator i=selector.selectedKeys().iterator();
- 处理每一个事件
While(i.hasNext()){
SelectionKey key=i.next();
i.remove();
If(key.isAcceptable()){
}else if(key.isReadable()){
}
}
read(SelectionKey key)
}