一、下载及安装
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