Netty使用Protobuf进行编解码

来源:互联网 发布:淘宝店铺号在哪里看 编辑:程序博客网 时间:2024/04/30 08:03

一、下载及安装

Protobuf安装包:

https://github.com/google/protobuf/releases/download/v2.6.1/protoc-2.6.1-win32.zip解压即可。

protobuf jar包:

http://repo2.maven.org/maven2/com/google/protobuf/protobuf-java/2.6.1/添加到java项目中


二、编写需要进行编解码的消息实体proto文件及生成对应的java类

1,新建proto文件:在protoc解压目录下找到..\protoc-2.6.1-win32\protoc.exe此文件,在protoc.exe同级目录新建一个目录(本例命名为protobuf),然后在protobuf目录下编写对应的编解码消息实体,本例新建了两个消息实体proto(Header.proto,NettyMessage.proto),具体内容如下:

Header.proto:

packageprotobuf; //该文件所在的文件夹名称

optionjava_package = "com.test.netty.protobuf";  //输出的java包

optionjava_outer_classname = "Header"; //输出的java类名

messageHeaderProto{ 

    optional int32 type=1;//[修饰符][类型][消息项名称]=[唯一标识]

NettyMessage.proto:

package protobuf; //该文件所在的文件夹名称

import "protobuf/Header.proto";//导入依赖的proto文件

optionjava_package = "com.test.netty.protobuf";   //输出的java包

option java_outer_classname ="NettyMessage";  //输出的类名

message NettyMessageProto{ 

    requiredHeaderProto header= 1; //required 表示必填

    optionalstring body= 2;  //optional 表示不必填

2,生成对应的java类

打开cmd:进入到protobuf安装包的proto.exe文件的父级目录。

如:D:\software\tool\protoc-2.6.1-win32>

再分别输入命令:

protoc .\protobuf\HeaderProto.proto --java_out .\  

protoc .\protobuf\NettyMessageProto.proto – java_out.\

生成对应的java类在protoc.exe的同级目录下。

关于protobuff更多详细指南,请访问http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html


三、在netty中使用protobuf.

1,将生成好的java消息类放入netty中,并添加protobuf依赖的jar包。

2,netty客户端构造握手请求编解码示例代码。

public void channelActive(ChannelHandlerContext ctx)throws Exception { 

    //构造握手请求消息

    HeaderProto header =Header.HeaderProto.newBuilder().setType(0).build();

    NettyMessageProto reqMessage =NettyMessage.NettyMessageProto.newBuilder().setHeader(header).setBody("hello").build();

    ctx.writeAndFlush(reqMessage);

    } 

3,netty服务端握手响应编解码示例代码。

         publicvoid channelRead(ChannelHandlerContext ctx, Object msg) 

           throws Exception {

                   NettyMessageProtoreqMessage = (NettyMessageProto) msg;

                   System.out.println("receivemsg from client:"+reqMessage.getBody());

                   HeaderProtoheader = Header.HeaderProto.newBuilder().setType(1).build();

    NettyMessageProto respMessage =NettyMessage.NettyMessageProto.newBuilder().setHeader(header).setBody("welcome").build();

    ctx.writeAndFlush(respMessage);

           } 

4,netty服务器端及客户端通道中设置protobuf编解码。

   //protobuf编解码

ch.pipeline().addLast(newProtobufVarint32FrameDecoder());//编码器,netty框架实现,直接实例化

ch.pipeline().addLast(newProtobufDecoder(NettyMessage.NettyMessageProto.getDefaultInstance()));//netty已实现,只需传入具体的消息实例

ch.pipeline().addLast(newProtobufVarint32LengthFieldPrepender());//转码器,netty框架实现,直接实例化

ch.pipeline().addLast(new ProtobufEncoder());//转码器,netty框架实现,直接实例化

ch.pipeline().addLast(new EchoClientHandler());//业务处理handler

0 0
原创粉丝点击