1 Channel的主要成员和方法
通道是Netty的核心概念之一,代表网路连接,有它负责同对端网络进行网络通信,既可以写入数据到对端,也可以从对端读取数据。
Netty通道的抽象类AbstractChannel的构造函数如下:
protected AbstractChannel(Channel parent) {
//父通道
this.parent = parent;
this.id = this.newId();
//新建一个底层的NIO通道,完成实际的IO操作
this.unsafe = this.newUnsafe();
//新建一条通道流水线
this.pipeline = this.newChannelPipeline();
}
AbstractChannel内部有一个pipeline属性,表示处理器的流水线。Netty在对通道进行初始化的时候,将pipiline属性初始化为DefaultChannelPipeline的实例。以上代码表明每个通道都拥有一条ChannelPipeline处理器流水线。
AbstractChannel内部有一个parent父通道属性,保持通道的父通道。对于连接监听通道(如NioServerSocketChannel)来说,其parent属性的值为null;对于传输通道(如NioSocketChannel)来说,其parent属性的值为接收到该连接的监听通道。
几乎所有的Netty通道实现类都继承了AbstractChannel抽象类,都拥有上面的parent和pipeline两个属性成员。
下面介绍通道接口中所定义的几个重要方法。
(1)
public ChannelFuture connect(SocketAddress remoteAddress) {
return this.pipeline.connect(remoteAddress);
}
此方法的作用为连接远程服务器。方法的参数为远程服务器的地址,调用后会立即返回,其返回值为执行连接操作的异步任务ChannelFuture。此方法在客户端的传输通道使用。
(2)
public ChannelFuture bind(SocketAddress localAddress) {
return this.pipeline.bind(localAddress);
}
此方法的作用为绑定监听地址,开始监听新的客户端连接。此方法在服务器的新连接监听和接收通道时调用。
(3)
public ChannelFuture close() {
return this.pipeline.close();
}
此方法的作用为关闭通道连接,返回连接关闭的ChannelFuture异步任务。如果需要再连接正式关闭后执行其他操作,则需要为异步任务设置回调方法;或者调用ChannelFuture异步任务的sync()方法来阻塞当前线程,一直等到通道关闭的异步任务执行完毕。
(4)
public Channel read() {
this.pipeline.read();
return this;
}
此方法的作用为读取通道数据,并且启动入站处理。具体来说,从内部的Java NIO Channel通道读取数据,然后启动内部的Pipeline流水线,开始数据读取的入站处理。此方法的返回通道自身用于链式调用。
(5)
public ChannelFuture write(Object msg) {
return this.pipeline.write(msg);
}
此方法的作用为启动出站流水处理,把处理后的最终数据写到底层通道(如Java NIO通道)。此方法的返回值为出站处理的异步处理任务。
(6)
public Channel flush() {
this.pipeline.flush();
return this;
}
此方法的作用为将缓冲区中的数据立即写出到对端。调用前面的write()出站处理,并不能将数据直接写出到对端,write操作的作用在大部分情况下仅仅是写入操作系统的缓冲区,操作系统会根据缓冲区的情况决定什么时候把数据写到对端。执行flush()方法会立即将缓冲区的数据写到对端。
上面的6种方法仅仅是比较常见的通道方法。在Channel接口中以及各种通道的实现类中还定义了大量的通道操作方法。在一般的日常开发中,如果需要用到,请直接查阅Netty API文档或者源码。
2 EmbeddedChannel
在Netty的实际开发中,底层通信传输的基础工作Netty已经替大家完成。实际上,更多的工作是设计和开发ChannelHandler业务处理器。处理器开发完成后,需要投入单元测试。一般的单元测试流程是:
1、将Handler业务处理器加入到通道的Pipeline流水线。
2、先后启动Netty服务器、客户端程序,相互发送消息,测试业务处理器的效果。
这些复杂的工序存在一个问题:如果每开发一个业务处理器都需要进行服务器和客户端的重复启动,那么整个的过程是非常繁琐和浪费时间。如果解决这个问题呢?Netty提供了一个专用通道,即EmbeddedChannel(嵌入式通道)。
EmbeddedChannel仅仅是模拟入站和出站的操作,底层不进行实际传输,不需要启动Netty服务器和客户端。除了不进行传输之外,EmbeddedChannel的其他事件机制和处理流程和真正的传输通道是一模一样的。因此,使用EmbeddedChannel,开发人员可以在单元测试用例中方便、快速地进行ChannelHandler业务处理器的单元测试。
为了模拟数据的发送和接收,EmbeddedChannel提供了一组专门的方法,如下图:

最低0.47元/天 解锁文章
1284

被折叠的 条评论
为什么被折叠?



