是否可以在 protobuf-csharp-port 中检测消息类型?
Is it possible to detect message type in protobuf-csharp-port?
一个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();
其中buffer是从socket读取的字节数组
但现在我处于客户端需要发送"Heartbeat"消息(另一个消息)以检查服务器是否存在的情况. (服务器应响应:"yes i'm alive")
当然可以,我可以向 MSG
class 添加另一个字段。但我不想这样做,因为 MSG
class 有很多不必要的字段 - 对于 Heartbeat 操作。
问题:
服务器读取了 n 个字节。无论如何我可以知道这是 MSG
消息还是 "Heartbeat" 消息?
Is there anyway I can know if this is a MSG message or a "Heartbeat" message?
没有。 Protocol buffer 消息不包含任何此类类型信息。通常,解决这个问题的方法是为您 可能 想要发送的每条消息设置一个 "wrapper" 类型和一个字段。理想情况下,您希望将其表达为 oneof
,但我的端口(目前)还不支持。
开销很小 - 当然,这将是协议更改,因此您需要考虑任何现有服务器等。
一个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();
其中buffer是从socket读取的字节数组
但现在我处于客户端需要发送"Heartbeat"消息(另一个消息)以检查服务器是否存在的情况. (服务器应响应:"yes i'm alive")
当然可以,我可以向 MSG
class 添加另一个字段。但我不想这样做,因为 MSG
class 有很多不必要的字段 - 对于 Heartbeat 操作。
问题:
服务器读取了 n 个字节。无论如何我可以知道这是 MSG
消息还是 "Heartbeat" 消息?
Is there anyway I can know if this is a MSG message or a "Heartbeat" message?
没有。 Protocol buffer 消息不包含任何此类类型信息。通常,解决这个问题的方法是为您 可能 想要发送的每条消息设置一个 "wrapper" 类型和一个字段。理想情况下,您希望将其表达为 oneof
,但我的端口(目前)还不支持。
开销很小 - 当然,这将是协议更改,因此您需要考虑任何现有服务器等。