【发布时间】:2010-08-27 15:12:35
【问题描述】:
我正在使用 Jon Skeet 的(优秀的)将 Google 协议缓冲区移植到 C#/.Net。
为了练习,我编写了一个虚拟即时通讯应用程序,它通过套接字发送一些消息。我有一个消息定义如下:-
message InstantMessage {<br/>
required string Message = 1;<br/>
required int64 TimeStampTicks = 2; <br/>
}
当发送者序列化消息时,它发送的非常优雅:-
...
InstantMessage.Builder imBuild = new InstantMessage.Builder();
imBuild.Message = txtEnterText.Text;
imBuild.TimeStampTicks = DateTime.Now.Ticks;
InstantMessage im = imBuild.BuildPartial();
im.WriteTo(networkStream);
...
这很好用。但另一方面,我无法让ParseFrom 工作。
我想使用:-
InstantMessage im = InstantMessage.ParseFrom(networkStream);
但是我不得不将它读取到字节,然后从这里解析它。由于多种原因,这显然不是理想的。当前代码是:-
while (true)
{
Byte[] byteArray = new Byte[10000000];
int intMsgLength;
int runningMsgLength = 0;
DateTime start = DateTime.Now;
while (true)
{
runningMsgLength += networkStream.Read(byteArray, runningMsgLength, 10000000 - runningMsgLength);
if (!networkStream.DataAvailable)
break;
}
InstantMessage im = InstantMessage.ParseFrom(byteArray.Take(runningMsgLength).ToArray());
当我尝试使用ParseFrom 时,即使我知道在线上有有效的 GB 消息,控制也不会返回到调用方法。
如有任何建议,我们将不胜感激,
私服
【问题讨论】:
-
Dataavailable 在这里是一个糟糕的选择,顺便说一句。它不会告诉您任何有关实际数据的信息。
-
明天会调查这个。今晚太累了。
标签: c# .net networkstream protocol-buffers