您的位置:首页 > 其它

Netty使用Protobuf进行编解码

2016-11-23 15:06 106 查看
一、下载及安装

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: