gpt4 book ai didi

c# - 如何处理传入的 protobuf 消息

转载 作者:可可西里 更新时间:2023-11-01 02:42:41 24 4
gpt4 key购买 nike

我使用 TCPClient 的 NetworkStream 和 protobuf-net 通过 TCP 发送和接收 protobuf 消息。

看到一个类似的问题:How to properly handle incoming protobuf message with a NetworkStream?

但在我的例子中,只能有一种消息类型,所以我认为我不需要解析器。

所以我序列化了我的对象并使用 tcp/ip 发送它,在我的服务器上我尝试反序列化它并得到 io 异常:无法从传输连接读取数据。

客户:

...
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, person);

data = ms.ToArray();
}
NetworkStream stream = client.GetStream();

stream.Write(data, 0, data.Length);

服务器:

...
Byte[] bytes = new Byte[256];
String data = null;

while(true)
{
Console.Write("Waiting for a connection... ");

TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");

data = null;

NetworkStream stream = client.GetStream();
Person newPerson = Serializer.Deserialize<Person>(stream);<--- exeption
}

最佳答案

我认为这里的简短版本是:使用 SerializeWithLengthPrefixDeserializeWithLengthPrefix。默认的 protobuf 行为是“读取到流的末尾”。顺便说一句,序列化时你不应该需要 MemoryStream;你应该可以Serialize直接到NetworkStream。如果您出于其他原因需要 MemoryStream,您可以使用以下方法为自己保存一份数据副本:

stream.Write(ms.GetBuffer(), 0, (int)ms.Length);

关于c# - 如何处理传入的 protobuf 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27532289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com