Netty框架入门学习--protobuf的多协议消息

在上一篇博客里面,已经使用protobuf写了一个简单的demo。
但是有一个问题,就是我们传输的消息类型是在代码定义死的,在这个代码中永远都是Student,如果还有别的类型的话就无法进行处理了。
在这里插入图片描述

解决方法

在proto文件外层定义一个消息。然后通过一种枚举的方式来定义消息传递的类型。写多个消息类型,通过一个最外层的消息对象包装一下。

在上一篇博客的代码中进行改造。

Student.proto 添加一个外部消息MyMessage,再添加几个消息类型Student,School,Hobby

syntax = "proto2";

package com.hll.protobuf;

option optimize_for = SPEED;
option java_package = "com.hll.netty.sixthexample";
option java_outer_classname = "MyMessageInfo"; //为了和之前的区分开,更改个名字

//定义一个外部消息,枚举类型
message MyMessage {
    enum DataType {
        StudentType = 1; //对应Student
        SchoolType = 2; //对应School
        HobbyType = 3; //对应hobby
    }
    //required表示这个外部消息必须有一个类型值
    required DataType data_type = 1;

    //oneof表示多个当中有一个被赋值
    oneof dataBody {
        //下面三个类型同一时刻只能出现一个
        Student student = 2;
        School school = 3;
        Hobby hobby = 4;
    }
}

//消息类型1
message Student {
    required string name = 1;
    optional int32 age = 2;
    optional string address = 3;
}

//消息类型2
message School {
    required string school_name = 1;
}

//消息类型3
message Hobby {
    optional string name = 1;
}

之后,通过protoc命令来重新生成文件。

#这里面的文件路径和文件名根据自己的项目写
protoc --java_out=src/main/java src/protobuf/Student.proto

在这里插入图片描述


然后就是把服务端和客户端的代码改造下。

服务端

TestServerInitializer
在这里插入图片描述

TestServerHandler
在这里插入图片描述

客户端

TestClientInitializer
在这里插入图片描述

TestClientHandler
在这里插入图片描述

启动服务端和客户端,客户端多执行几次的话,我们就可以在控制台看到不同的消息类型数据的输出
在这里插入图片描述

发布了77 篇原创文章 · 获赞 23 · 访问量 17万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览