从今天开始,记录一下Netty学习的一些笔记和总结。下面从一个简单的Netty例子开始。
Netty客户端和服务端概览
从下图可以看出,我们要编写的是Echo的客户端和服务端。其中有多个客户端同时连接到同一台服务器。在客户端创建一个连接到服务端之后,可以向其发送一个或多个消息;之后,服务端又会将每个消息回传给客户端。
服务端实现
下面我们看一下精简后的服务端实现(下方代码参考Netty官方Demo,并做了简化)。服务端代码主要包括了2个类:EchoServerHandler和EchoServer,其中EchoServerHandler包含了我们在接收到客户端的请求后,写回给客户端的程序逻辑;EchoServer可以认为是一个粘合或引导,其组装了处理业务逻辑的EchoServerHandler,及相关的系统配置参数等。下面我们看下详细的代码实现:
EchoServerHandler
上面的EchoServerHandler继承自ChannelInboundHandlerAdapter(表示入站处理器),在读取到客户端的消息之后,又将消息原样写回给了客户端。
EchoServer
从上面代码可以看出,我们首先创建了2个EventLoopGroup:bossGroup和workerGroup。然后使用Netty服务端粘合组件:ServerBootstrap将bossGroup、workerGroup传入,然后设置相关其他的参数。设置的参数其中就包含了业务处理逻辑EchoServerHandler,其设置是在 .childHandler中设置的。因为ServerSocketChannel会创建子的SocketChannel,子channel会负责处理客户端的请求和发送应答数据。
ServerBootstrap的参数设置完成之后,就可以调用 b.bind(PORT).sync() 启动服务端程序了。
客户端实现
客户端实现主要包括了2个类:EchoClientHandler和EchoClient。其中EchoClientHandler包含了向Server端发送请求的逻辑,也就是在channelActive之后向Server端发送请求;EchoClient类似于EchoServer,是一个引导程序。
EchoClientHandler
上面的客户端业务代码,在创建Handler时初始化了ByteBuf,并且写入了数据。然后在channelActive的时候完成了向Server端发送消息。在客户端接收到服务端发送的数据后,又向服务端写入了数据,然后一直循环ping-pong。
EchoClient
参考:Netty源码