版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33151213/article/details/90760707
在上一篇博客里面,已经使用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
启动服务端和客户端,客户端多执行几次的话,我们就可以在控制台看到不同的消息类型数据的输出