Netty源码剖析与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 Netty服务端构建

TCP通信是面向连接的、可靠的、基于字节流的通信协议,有严格的客户端和服务端之分,本节运用Netty构建TCP服务端,同时为后面构建分布式RPC服务器做好准备。

Netty服务端程序实现步骤如下。

(1)创建两个线程组,分别为Boss线程组和Worker线程组。Boss线程专门用于接收来自客户端的连接;Worker线程用于处理已经被Boss线程接收的连接。

(2)运用服务启动辅助类ServerBootstrap创建一个对象,并配置一系列启动参数,如参数ChannelOption .SO_RCVBUF和ChannelOption .SO_SNDBUF分别对应接收缓冲区和发送缓冲区的大小。

(3)当Boss线程把接收到的连接注册到Worker线程中后,需要交给连接初始化消息处理Handler链。由于不同的应用需要用到不同的Handler链,所以Netty提供了ChannelInitializer接口,由用户实现此接口,完成Handler链的初始化工作。

(4)编写业务处理Handler链,并实现对接收客户端消息的处理逻辑。

(5)绑定端口。由于端口绑定需要由Boss线程完成,所以主线程需要执行同步阻塞方法,等待Boss线程完成绑定操作。

在编码前先构建开发环境。开发工具选择Spring Tool Suite或IntelliJ IDEA,其他工具选择Maven v3.2.5、JDK v1.8、稳定版的Netty v4.1.38.Final。首先打开STS,构建一个Maven工程,并将Netty的依赖放入pom.xml中。具体实现代码如下:

Netty的Maven工程构建图如图1-1所示。

图1-1 Netty的Maven工程构建图

按照服务端程序实现步骤新建一个Netty服务类,具体代码如下:

服务端还需要编写一个业务逻辑处理Handler(名称为ServerHandler),这个Handler需要读取客户端数据,并对请求进行业务逻辑处理,最终把响应结果返回给客户端。ServerHandler需要继承ChannelInboundHandlerAdapter,它是ChannelInboundHandler的子类,这跟Netty的处理数据流向有关。当NioEventLoop线程从Channel读取数据时,执行绑定在Channel的ChannelInboundHandler对象上,并执行其channelRead()方法。具体实现代码如下: