服务器致力于使用一个父Channel 来接受
来自客户端的连接,并创建子Channel 以用于它们之间的通信;而客户端将最可能只需要一个
单独的、没有父Channel 的Channel 来用于所有的网络交互。(正如同我们将要看到的,这也
适用于无连接的传输协议,如UDP,因为它们并不是每个连接都需要一个单独的Channel。)
为什么引导类是Cloneable 的
你有时可能会需要创建多个具有类似配置或者完全相同配置的Channel。
为了支持这种模式而又不需要为每个Channel 都创建并配置一个新的引导类实例,
AbstractBootstrap 被标记为了Cloneable在一个已经配置完成的引导类实例上调用clone()方法将返回另一个可以立即使用的引导类实例。
注意,这种方式只会创建引导类实例的EventLoopGroup的一个浅拷贝,
所以,后者将在所有克隆的Channel实例之间共享。
这是可以接受的,因为通常这些克隆的Channel的生命周期都很短暂,
一个典型的场景是——创建一个Channel以进行一次HTTP请求。
关于IllegalStateException 的更多讨论
在引导的过程中,在调用bind()或者connect()方法之前,必须调用以下方法来设置所需的组件:
group();
channel()或者channelFactory();
handler()。
如果不这样做,则将会导致IllegalStateException。对handler()方法的调用尤其重要,因
为它需要配置好ChannelPipeline。
ServerChannel 的实现负责创建子Channel,这些子Channel 代表了已被接受的连接。
我们在这一节中所讨论的主题以及所提出的解决方案都反映了编写Netty 应用程序的一个一
般准则:尽可能地重用EventLoop,以减少线程创建所带来的开销。