是否可以在 protobuf-csharp-port 中检测消息类型

本文关键字:检测 消息 类型 protobuf-csharp-port 是否 | 更新日期: 2023-09-27 18:36:01

Java 客户端根据这个框架构造一个消息:

package tutorial;
option java_package = "com.example.sff.piki2";
option java_outer_classname = "MsgProtos";
message MSG {
 required string guid = 1; 
 required int32 MsgCode = 2;
 required int32 From = 3;  //sender
 ...

此消息将发送到 C# 程序(服务器端)。

服务器知道如何读取字节(第一个字节是要读取的字节数,表示以下消息的大小)。

这就是由字节数组构造 MSG 的方式。

 MSG Msg = MSG.CreateBuilder().MergeFrom(buffer).Build();

其中缓冲区是从套接字读取的字节数组。

但是现在我的情况是客户端需要发送"心跳"消息(另一条消息)以检查服务器是否处于活动状态。 (服务器应该响应:"是的,我还活着")

当然,我可以向MSG类添加另一个字段,但我不想这样做,因为MSG类有很多不必要的字段 - 用于心跳操作。

问题:

服务器读取 n 个字节。无论如何,我可以知道这是MSG消息还是"心跳"消息?

是否可以在 protobuf-csharp-port 中检测消息类型

无论如何,我可以知道这是味精消息还是"心跳"消息?

不。协议缓冲区消息不包含任何此类类型信息。通常,解决此问题的方法是使用"包装器"类型,其中包含您可能要发送的每条消息的字段。理想情况下,您希望将其表示为oneof,但我的端口(尚不支持)。

开销很小 - 但当然,这将是一个协议更改,因此您需要考虑任何现有的服务器等。