深入理解Netty编解码、粘包拆包、心跳机制( 五 )

  1. 解压压缩包 , 并进入你自己解压的目录
tar xyf protobuf-all-3.13.0.tar.gzcd protobuf-3.13.0
  1. 设置编译目录
./configure --prefix=/usr/local/protobuf
  1. 安装
makemake install
  1. 配置环境变量
第一步:找到.bash_profile文件并编辑
cd ~open .bash_profile第二步:然后在打开的bash_profile文件末尾添加如下配置:
export PROTOBUF=/usr/local/protobuf export PATH=$PROTOBUF/bin:$PATH第三步:source一下使文件生效
source .bash_profile
  1. 测试安装结果
protoc --version使用Google Protobuf以下步骤参考Google Protobuf的github项目的指南 。
第一步:添加maven依赖
com.google.protobufprotobuf-java3.11.0第二步:编写proto文件Message.proto
如何编写.proto文件的相关文档说明 , 可以去官网查看 下面写一个例子 , 请看示范:
syntax = "proto3"; //版本option java_outer_classname = "MessagePojo";//生成的外部类名 , 同时也是文件名message Message {int32 id = 1;//Message类的一个属性 , 属性名称是id , 序号为1string content = 2;//Message类的一个属性 , 属性名称是content , 序号为2}第三步:使用编译器 , 通过.proto文件生成代码
在执行上面的安装步骤后 , 进入到 bin 目录下 , 可以看到一个可执行文件 protoc
cd /usr/local/protobuf/bin/然后复制前面写好的Message.proto文件到此目录下 , 如图所示:
深入理解Netty编解码、粘包拆包、心跳机制文章插图
输入命令:
protoc --java_out=. Message.proto然后就可以看到生成的MessagePojo.java文件 。 最后把文件复制到IDEA项目中 。
深入理解Netty编解码、粘包拆包、心跳机制文章插图
第四步:在发送端添加编码器 , 在接收端添加解码器
客户端添加编码器 , 对消息进行编码 。
@Overrideprotected void initChannel(SocketChannel ch) throws Exception { //在发送端添加Protobuf编码器ch.pipeline().addLast(new ProtobufEncoder()); ch.pipeline().addLast(new TcpClientHandler());}服务端添加解码器 , 对消息进行解码 。
@Overrideprotected void initChannel(SocketChannel ch) throws Exception { //添加Protobuf解码器 , 构造器需要指定解码具体的对象实例 ch.pipeline().addLast(new ProtobufDecoder(MessagePojo.Message.getDefaultInstance())); //给pipeline管道设置处理器 ch.pipeline().addLast(new TcpServerHandler());}第五步:发送消息
客户端发送消息 , 代码如下:
@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception { //使用的是构建者模式进行创建对象 MessagePojo.Message message = MessagePojo.Message.newBuilder().setId(1).setContent("一角钱 , 起飞~").build();ctx.writeAndFlush(message);}服务端接收到数据 , 并且打印:
@Overrideprotected void channelRead0(ChannelHandlerContext ctx, MessagePojo.Message messagePojo) throws Exception {System.out.println("id:" + messagePojo.getId());System.out.println("content:" + messagePojo.getContent());}