![跟闪电侠学Netty:Netty即时聊天实战与底层原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/384/43738384/b_43738384.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.1 客户端发送数据到服务端
在客户端启动流程这一章,读者已经了解到客户端相关的数据读写逻辑是通过Bootstrap的handler()方法指定的。
![](https://epubservercos.yuewen.com/6C3355/23020652909769306/epubprivate/OEBPS/Images/txt007_1.jpg?sign=1738885729-Lhj7nIobUpj7QlHWZuU5zB2hqZF5t2q1-0-d2ccd8497bf61663285e45d9d8243979)
接下来在initChannel()方法里给客户端添加一个逻辑处理器,其作用是负责向服务端写数据。
![](https://epubservercos.yuewen.com/6C3355/23020652909769306/epubprivate/OEBPS/Images/txt007_2.jpg?sign=1738885729-LUQolpmthzZG1jayn0sOg9Bivp0Y5q5O-0-6c17004006af152fb60dd280dae325ea)
1.ch.pipeline()返回的是和这条连接相关的逻辑处理链,采用了责任链模式。
2.调用addLast()方法添加一个逻辑处理器,逻辑处理器的作用就是,在客户端建立连接成功之后,向服务端写数据。下面是这个逻辑处理器相关的代码。
![](https://epubservercos.yuewen.com/6C3355/23020652909769306/epubprivate/OEBPS/Images/txt007_3.jpg?sign=1738885729-6Ho9ZHAv87QP5An4uyHhXiIikhysmflA-0-06f3bb31c415236725c3835ea57327dd)
1.这个逻辑处理器继承自ChannelInboundHandlerAdapter,覆盖了channelActive()方法,这个方法会在客户端连接建立成功之后被调用。
2.客户端连接建立成功之后,调用channelActive()方法。在这个方法里,我们编写向服务端写数据的逻辑。
3.写数据的逻辑分为三步:首先需要获取一个Netty对二进制数据的抽象ByteBuf。在上面代码中,ctx.alloc()获取到一个ByteBuf的内存管理器,其作用就是分配一个ByteBuf。然后把字符串的二进制数据填充到ByteBuf,这样就获取到Netty需要的数据格式。最后调用ctx.channel().writeAndFlush()把数据写到服务端。
以上就是客户端启动之后,向服务端写数据的逻辑。可以看到,和传统的Socket编程不同的是,Netty里的数据是以ByteBuf为单位的,所有需要写出的数据都必须放到一个ByteBuf中。数据的写出如此,数据的读取亦如此。接下来我们看一下服务端是如何读取这段数据的。