0.NIO三大组件(channel、selector、buffer)
1.channel:
相当于socket,和socket相比是非阻塞式的
2.selector:
和一个线程组成一个整体,对channel进行轮询,对事件进行监听和派发
3.buffer:
数据缓存区,在内存中通过减少系统调用次数来提高传输速度
1.骨架
java
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>(){
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
// 添加处理器
socketChannel.pipeline().addLast(new ChannelHandler());
...
}
});
ChannelFuture f = serverBootstrap.bind(2333).sync();// 绑定端口,返回future
f.channel().closeFuture().sync();// 监听关闭事件,若有关闭指令便阻塞式关闭服务器
// sync:阻塞式等待,执行到该指令时候线程会阻塞,直到执行完毕才执行下一行代码
1.ServerBootstrap
服务器启动类,用于包装组件。包括:EventLoopGroup、ServerChannel、ChannelHandler
2.EventLoopGroup事件处理线程组(通常为一个线程)
3. ServerChannel处理网络通信的方法,通常使用NioServerSocketChannel(非阻塞)
4. ChannelHandler用于每个客户端连接通道定义不同的处理方式
2. ChannelHandler
channelhandler
常见实现类:SimpleChannelInboundHandler<>:
SimpleChannelInboundHandler
是一个泛型类,在定义时需要指定它所处理的消息类型。例如,SimpleChannelInboundHandler<ByteBuf>
表示这个处理器专门处理ByteBuf
类型的入站消息
ChannelInboundHandlerAdapter、ChannelOutboundHandlerAdapter:
在
channelRead
方法中接收的是Object
类型的消息,这意味着它可以处理任何类型的入站(出站)消息ChannelInitializer:
用于为serverBootstrap添加一系列的
channelhandler处理逻辑
channelhandler常见事件触发函数:
channelRegistered、channelUnregistered:
当使用
ServerBootstrap
启动一个服务器时,新接受的客户端连接对应的Channel
会被注册到EventLoop。
当一个客户端连接关闭时,对应的Channel
会从EventLoop
中注销,从而触发channelUnregistered
事件。
channelActive、channelInactive:
在一个TCP客户端连接到服务器后,如果连接成功建立,客户端的
Channel
就会触发channelActive
事件。如果一个服务器端与客户端的连接因为网络故障或者客户端主动断开而关闭,服务器端对应的Channel
就会触发channelInactive
事件。
channelRead、channelRead0:
在处理一个HTTP请求时,当整个请求体都被读取完毕后,对应的
Channel
会触发channelReadComplete
事件。
exceptionCaught:
如果在解析接收到的数据时发生格式错误,或者在发送数据时出现I/O错误,对应的
Channel
就会触发exceptionCaught
事件。
userEventTriggered:
如果在一个自定义的定时任务中,当定时时间到达时,可以通过
fireUserEventTriggered
方法触发一个用户自定义事件,从而在ChannelHandler
中触发userEventTriggered
事件。