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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/sinat_33151213/article/details/90760707
今日推荐