本章包括:
![](https://img-blog.csdn.net/20140714165145651?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluZ3J1a3Vu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1、引导启动客户端和服务器;
2、在一个channel内引导启动客户端;
3、添加ChannelHandlers;
4、使用ChannelOptions及attr;
主要分析在Netty应用中的以下组件是如何协调共存的:
1、EventLoopGroup类型;
2、Channel类型;
3、设置ChannelOptions;
4、在Channel注册后会被调用的ChannelHandlers;
5、指明被添加到Channel的特殊属性;
6、设置本地和远端地址;
7、绑定本地端口或连接到服务器(视乎类型);
不同的引导启动类型
Netty包括两种引导启动类型。一个像服务器那样接受连接,并为每个连接创建“子”Channel。第二个像客户端那样不接收新的连接,且在“父”Channel中处理所有的事。
UDP有点不同,它是面向无连接的。换句话说,由于UDP传输的本质,没有必要像TCP一样为每个连接创建一个Channel,这意味着一个单独的Channel即可处理所有的数据,而不需要“父-子”Channel关系。
AbstractBootstrap实现了Clone
able接口,因此通过对一个已经配置好的bootstrap进行深度克隆,将会返回一个可重用的副本,无需再次配置。注意Netty在克隆时,对bootstrap的EventLoopGroup仅做了一个影子拷贝,这表示EventLoopGroup将在所有的channels副本之间共享。
引导启动客户端和无连接协议
BootStrap类:
1、当调用bind()方法时,Bootstrap将创建一个新的Channel,随后就可以在channel上调用connection来建立连接;
2、当调用connection()方法时,Bootstrap将创建一个新的Channnel;
3、新创建的Channel;
EventLoop和EventLoopGroup
分配给Channel的EventLoop负责处理Channel中的所有操作,这说明任何时候在执行一个返回ChannelFuture的方法时,它将在被分配给这个Channel的EventLoop中被执行。
EventLoop被绑定到它的线程执行。
EventLoopGroup包括一组EventLoop,并负责在Channel注册过程中,分配一个EventLoop给它。
选择不兼容的channel实现将导致IllegalStateException。
使用ServerBootstrap引导启动Netty服务器
ServerBootstrap类:
1、当调用bind()方法时,Bootstrap将创建一个新的channel,一旦绑定成功,这个channel将负责接收连接并创建子channel;
2、接收新的连接请求并创建子channel,用于服务接收到的连接;
3、用于服务接收到的连接的channel;
在一个channel内引导启动客户端
有些场景下会需要在一个Channel内部引导启动另外一个客户端channel,如实现一个代理或从其它系统获取数据。
共享EventLoop的好处:
可以确保所有分配给EventLoop的Channels都使用相同的线程,记住EventLoop被分配给一个线程并由它执行EventLoop的操作。
因为使用了相同的线程,不需要上下文切换,因此开销更少。
1、Bootstrap在调用bind方法时创建新的channel,一旦bind成功,这个channel将接收子channel;
2、接收新的连接请求并创建子channel,用于服务被接收的连接;
3、服务被接收连接的channel;
4、channel创建Bootstrap,一旦它的connection方法被调用,一个新的channel将被创建;
5、新创建的channel连接到远端;
6、channel间共享的EventLoop;
添加ChannelHandlers
ChannelInitializer类,辅助添加ChannelHandlers到ChannelPipeline。
使用ChannelOptions及attr
Attributes类似ServletRequest。