3 netty的组件和设计
关于EventLoopGroup、EventLoop、ServerChannel、Channel之间的关系,还是没搞明白。
Channel—Socket;
EventLoop—控制流、多线程处理、并发;
ChannelFuture—异步通知。
channel的结构如上:我们最常用的是NioServerSocketChannel 和 NioSocketChannel
Channel、EventLoop、Thread 以及EventLoopGroup 之间的关系如下:
//(2) 创建ServerBootstrap ServerBootstrap b = new ServerBootstrap(); b.group(group) //(3) 指定所使用的 NIO 传输 Channel .channel(NioServerSocketChannel.class) //(4) 使用指定的端口设置套接字地址 .localAddress(new InetSocketAddress(port)) //(5) 添加一个EchoServerHandler到于Channel的 ChannelPipeline .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { //EchoServerHandler 被标注为@Shareable,所以我们可以总是使用同样的实例 //这里对于所有的客户端连接来说,都会使用同一个 EchoServerHandler,因为其被标注为@Sharable, //这将在后面的章节中讲到。 ch.pipeline().addLast(serverHandler);//这个就是Handler的添加顺序 } });
面向连接的协议 请记住,严格来说,“连接”这个术语仅适用于面向连接的协议,如TCP,其
保证了两个连接端点之间消息的有序传递。
有两种类型的引导:一种用于客户端(简单地称为Bootstrap),而另一种
(ServerBootstrap)用于服务器。无论你的应用程序使用哪种协议或者处理哪种类型的数据,
唯一决定它使用哪种引导类的是它是作为一个客户端还是作为一个服务器。
① 实际上,ServerBootstrap 类也可以只使用一个EventLoopGroup,此时其将在两个场景下共用同一个EventLoopGroup。—译者注
与ServerChannel 相关联的EventLoopGroup 将分配一个负责为传入连接请求创建
Channel 的EventLoop。一旦连接被接受,第二个EventLoopGroup 就会给它的Channel
分配一个EventLoop。
关于EventLoopGroup、EventLoop、ServerChannel、Channel之间的关系,还是没搞明白。