Netty使用Google Protobuf实现编解码

Posted 码农的修炼之道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty使用Google Protobuf实现编解码相关的知识,希望对你有一定的参考价值。

Google Protobuf是一个开源的高效的序列化工具,在RPC场景下使用广泛。同样,Facebook开源的Thrift也是一款强大的序列化框架。本文旨在和大家探讨怎么在netty框架上使用Protobuf实现快速的编解码。

1、搭建环境

        本文的场景是在windows环境下,没有使用Maven环境(使用Maven更方便)。首先,我们要去下载一些文件protoc-2.5.0-win32.zip。同样,还有protobuf-java-2.4.1.jar

2、编写proto文件


       本文编写一个SubscribeReq.proto文件。这种文件编写的格式要符合protobuf规范,这个网上有很多教程和写法。下面看一下文件内容:

     其实就是定义了一个消息SubscribeReq,里面包含了4个信息,分别是ID,userName等。在我们日常开发中,消息都是靠消息ID进行解包的。

    写完了proto文件,然后我们调用protoc.exe来编译proto文件。编译完成,会生成SubscribeReqProto.java文件。然后我们把这个文件复制到工程的包下。

Netty使用Google Protobuf实现编解码

       同样的,将SubscribeReq.proto文件也复制到包下。最后,将之前的Jar包添加到工程Build路径。

3、客户端实现

        客户端和之前的案例类似,只是在pipeline中加入了Netty给我们实现好的Protobuf编码器。 所以我们添加ProtobufVarint32LengthFieldPrependerProtobufEncoder这两个handler,然后我们实现一个自定义的

ProtoBufClientHandler。代码如下:

Netty使用Google Protobuf实现编解码

       我们来看看ProtoBufClientHandler怎么实现的,这里为了省事,直接写了一个内部类。这里为了省事,直接在channel被激活的时候发送一条消息出去。

Netty使用Google Protobuf实现编解码

4、服务端实现

        和之前的案例类似,我们在服务端的Pipeline上添加以下这几个Handler,

ProtobufVarint32FrameDecoderProtobufDecoder以及自定义的用户处理器ProtoBufServerHandler。代码如下所示:

Netty使用Google Protobuf实现编解码

      接下来我们看看自定义的ProtoBufServerHandler怎么实现的。这里和客户端类似,写了一个内部类,我们在channelRead()方法中进行解析protobuf消息。直接看代码:

Netty使用Google Protobuf实现编解码

5、测试

      我们启动服务器端和客户端,服务器端运行结果如下:

       到这里,说明了我们客户端使用Protobuf编码的消息在服务端已经正确接收到。同时,服务端也能正常解码出来。

6、小结

      在实际开发中吗,我们一般只要写一个Proto文件,这里面定义了很多的消息结构体。在代码中体现出来的就是各字段的set/get方法。极大的简化了我们编解码的过程。


  

以上是关于Netty使用Google Protobuf实现编解码的主要内容,如果未能解决你的问题,请参考以下文章

Netty-整合Protobuf高性能数据传输

netty编解码之使用protobuf

Netty4.XUnity与Netty使用protoBuf

netty系列之:在netty中使用protobuf协议

Netty学习4(学习笔记)

10.netty客户端与服务器使用protobuf传输报文