上篇文章高性能NIO框架Netty入门篇我们对Netty做了一个简单的介绍,并且写了一个入门的Demo,客户端往服务端发送一个字符串的消息,服务端回复一个字符串的消息,今天我们来学习下在Netty中怎么使用对象来传输数据。
上篇文章中传输字符串我们用的是框架自带的StringEncoder,StringDecoder编解码器,现在想要通过对象来传输数据,该怎么弄呢?
既然StringEncoder和StringDecoder可以传输字符串,我们来看看这2个类的源码不就知道它们到底做了一些什么工作。
StringEncoder
通过继承MessageToMessageEncoder,重写encode方法来进行编码操作,就是将字符串进行输出即可。
StringDecoder
继承MessageToMessageDecoder,重写decode方法,将ByteBuf数据直接转成字符串进行输出,解码完成。
通过上面的源码分析,我们发现编解码的原理无非就是在数据传输前进行一次处理,接收后进行一次处理,在网络中传输的数据都是字节,我们现在想要传PO对象,那么必然需要进行编码和解码2个步骤,我们可以自定义编解码器来对对象进行序列化,然后通过ByteBuf的形式进行传输, 传输对象需要实现java.io.Serializable接口。
首先我们定义一个传输对象,实现序列化接口,暂时先定义2个字段,一个ID,用来标识客户端,一个内容字段,代码如下:
传输对象定好后,定义对象的编解码器。
对象编码器
将对象序列化成字节,通过ByteBuf形式进行传输,ByteBuf是一个byte存放的缓冲区,提供了读写操作。
对象解码器
接收ByteBuf数据,将ByteBuf反序列化成对象
将上篇文章中服务端的编解码器改成对象编解码器:
接下来编写服务端的消息处理类:
服务端改造好了之后,就要改造客户端了,同样的道理,客户端和服务端的编解码器都要一致才行。
客户端连接时指定对象编解码器和对象消息处理类,代码如下:
客户端消息处理类:
客户端启动类也需要改造,将发送字符串的消息变成对象消息
源码参考:https://github.com/yinjihuan/netty-im
更多技术分享请加入微信群进行交流:
领取专属 10元无门槛券
私享最新 技术干货