我在我的c ++服务器上使用protobuf。但我在socket中有多个不同的protobuf消息有问题 我定义了许多原型消息,例如
message SdkHGetRet {
required int32 opcode = 1;
required bytes value = 2;
}
message SdkHPut {
required bytes table = 1;
required bytes hname = 2;
required bytes key = 3;
required bytes value = 4;
optional int32 writesrc = 5 [default = 0];
}
message SdkSet {
required bytes table = 1;
required bytes key = 2;
required bytes value = 3;
optional int32 writesrc = 4 [default = 0];
}
message SdkSetRet {
required bool status = 1;
optional string master = 2;
}
message SdkInvalidOperation {
required int32 what = 1;
required bytes why = 2;
}
....
因此,每次我通过套接字发送消息时,我将添加8个字节,4个用于总套接字len,4个用于操作码,opcode表示消息类型。
所以在服务器端,我收到消息,我读了前4个字节,然后我得到了消息的长度,然后我将读取另外4个字节来获取消息的类型,最后我读取了消息的长度字节。然后我将消息类型用于方法映射(例如404 =>“sdkset”,405 =>“sdksetret”)来解码消息。
我发现这种方式运行良好,但我想知道有没有优雅的方法来识别没有4字节消息类型的消息。 我已经阅读了消息历史记录,一种方法是在一条大消息中添加整个消息,就像这样
message BigMessage
{
enum Type { sdkset = 0, sdksetred = 1}
require Type t = 1,
optional string key = 2,
...
}
由于我有超过40种类型的消息,我认为这种方式可能会影响性能,在我看来,这种方式看起来很难看。
那么你能给我任何好的建议吗。