1 Netty基本组件
1.1 网络通信之Netty模型
- NioEventLoop
NioEventLoop#run方法对应着Bio的while(true)轮询,里面存放业务逻辑代码;
对应着两个Thread:一个是服务端的监听,一个是对客户端的读写
用法:
创建两个NioEventLoopGroup,一个bossGroup一个workerGroup;
bossGroup是服务端的监听,,workerGroup是对客户端的读写;
bossGroup处理完连接请求后,会将这个连接提交给workerGroup来处理
- Channel
Channel则对应着Socket,服务端底层是NIO的ServerSocketChannel,客户端是自封装的NioSocketChannel;
程序由始至终只有一个NioServerSocketChannel;
每个连接生成一个NioSocketChannel 对象
- ByteBuf
ByteBuf则对应着IO读写;
- Pipeline
Pipeline则对应着业务逻辑链(Logic Chain),即while(true)里面的代码;是一个链表
问题:什么时候将Pipleline加入到每一个客户端连接的处理过程?
观看其构造方法源码可以得知,在创建NioSocketChannel的过程中加入的;
NioSocketChannel组合了Pipeline,new了一个DefaultChannelPipeline:
protected DefaultChannelPipeline(Channel channel) {
this.channel = ObjectUtil.checkNotNull(channel, "channel");
succeededFuture = new SucceededChannelFuture(channel, null);
voidPromise = new VoidChannelPromise(channel, true);
tail = new TailContext(this);
head = new HeadContext(this);
head.next = tail;
tail.prev = head;
}
- ChannelHandler
对应着一个业务逻辑(Logic),会加入到Pipeline中;
接口定义了许多被添加进Pipeline后的回调方法,如handlerAdded等
2 Netty服务端启动
案例代码:
public final class Server {
public static void