阅读 67

netty实战 第三章

Channel、Eventloop和ChannelFuture

Channel接口

在Java网络编程中,其基本的构造是Socket。Channel接口所提供的 API,大大地降低了直接使用网络原语的复杂性。

EventLoop接口

EventLoop定义了Netty的核心抽象,用于处理连接的生命周期中所发生的事件。

  1. 一个 EventLoopGroup 包含一个或者多个 EventLoop;
  2. 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;
  3. 所有由 EventLoop 处理的 I/O 事件都将在它专有的Thread上被处理;
  4. 一个 Channel 在它的生命周期内只注册于一个 EventLoop;
  5. 一个 EventLoop 可能会被分配给一个或多个Channel。

ChannelFuture 接口

Netty 中所有的 I/O 操作都是异步的。因为一个操作可能不会立即返回。所以,Netty 提供了ChannelFuture接口,其 addListener()方法注册了一个ChannelFutureListener,以便在某个操作完成时(无论是否成功)得到通知。

ChannelHandler和ChannelPipeline

ChannelHandler接口

ChannelHander可专门用于几乎任何类型的动作,例如将数据从一种格式转换为另外一种格式,或者处理转换过程中所抛出的异常。

ChannelPipeline接口

ChannelPipeline提供了ChannelHandler 链的容器,并定义了用于在该链上传播入站和出站事件流的 API。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline。
ChannelHandler安装到ChannelPipeline 中的过程如下所示

  1. 一个ChannelInitializer被注册到了ServerBootstrap中。
  2. 调用ChannelInitializer.initChannel()方法时,ChannelInitializer将在 ChannelPipeline中安装一组自定义的ChannelHandler。
  3. ChannelHander调用结束后,ChannelInitializer将其在ChannelPipeline移除。

若有多个ChannelHander注册到ChannelInitializer,其执行顺序是由它们被添加的顺序所决定的。

编码器和解码器

当通过Netty发送或者接收一个消息的时候,就将会发生一次数据转换。入站消息会被解码。从字节转换为另一种格式,通常是一个Java对象。如果是出站消息,则会发生相反方向的转换:它将从它的当前格式被编码为字节。这两种方向的转换的原因很简单:网络数据总是一系列的字节。
由Netty提供的编码器/解码器适配器类都实现了ChannelOutboundHandler或者ChannelInboundHandler接口.
抽象类SimpleChannelInboundHandler用于接收解码消息,在这个 ChannelHandler中,最重要的是实现channelRead0(ChannelHanderContext,T)方法,且不阻塞当前IO线程。

引导

Netty 的引导类为应用程序的网络层配置提供了容器,有两种类型的引导:一种用于Bootstrap客户端,而另一种ServerBootstrap用于服务器,

区别:

  1. ServerBootstrap 将绑定到一个端口,因为服务器必须要监听连接,而 Bootstrap 则是由想要连接到远程节点的客户端应用程序所使用的。
  2. 引导一个客户端只需要一个EventLoopGroup,但是一个ServerBootstrap 则需要两个(也可以是同一个实例)。

服务器需要两组不同的Channel。第一组将只包含一个 ServerChannel,代表服务器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来处理传入客户端连接(对于每个服务器已经接受的连接都有一个)的 Channel。

原文:https://www.cnblogs.com/dxyoung/p/14860398.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐