我正在使用 Jon Skeet 的(优秀的)谷歌协议缓冲区到 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 消息,控制也不会返回到调用方法。
任何建议将不胜感激,
私服