跟闪电侠学Netty:Netty即时聊天实战与底层原理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.1 客户端发送数据到服务端

在客户端启动流程这一章,读者已经了解到客户端相关的数据读写逻辑是通过Bootstrap的handler()方法指定的。

接下来在initChannel()方法里给客户端添加一个逻辑处理器,其作用是负责向服务端写数据。

1.ch.pipeline()返回的是和这条连接相关的逻辑处理链,采用了责任链模式。

2.调用addLast()方法添加一个逻辑处理器,逻辑处理器的作用就是,在客户端建立连接成功之后,向服务端写数据。下面是这个逻辑处理器相关的代码。

1.这个逻辑处理器继承自ChannelInboundHandlerAdapter,覆盖了channelActive()方法,这个方法会在客户端连接建立成功之后被调用。

2.客户端连接建立成功之后,调用channelActive()方法。在这个方法里,我们编写向服务端写数据的逻辑。

3.写数据的逻辑分为三步:首先需要获取一个Netty对二进制数据的抽象ByteBuf。在上面代码中,ctx.alloc()获取到一个ByteBuf的内存管理器,其作用就是分配一个ByteBuf。然后把字符串的二进制数据填充到ByteBuf,这样就获取到Netty需要的数据格式。最后调用ctx.channel().writeAndFlush()把数据写到服务端。

以上就是客户端启动之后,向服务端写数据的逻辑。可以看到,和传统的Socket编程不同的是,Netty里的数据是以ByteBuf为单位的,所有需要写出的数据都必须放到一个ByteBuf中。数据的写出如此,数据的读取亦如此。接下来我们看一下服务端是如何读取这段数据的。