我一直在通过创建一个应用程序来学习C#,而且我遇到了一个障碍,我真的很挣扎。
基本上我有下面的代码是我用来从我设置的网络流中读取的代码。它可以工作,但每次sslstream.Read()取消阻塞时,它只能读取1个数据包。这会导致大量的消息积压。
我正在尝试做的是,如果流读取的部分包含多个数据包,则全部读取它们。
我已多次尝试解决这个问题,但我最终陷入了一大堆代码。
如果有人能提供帮助,我会很感激!
(每个数据包的前4个字节是数据包的大小..数据包的范围在8个字节到28,000个字节之间)
SslStream _sslStream = (SslStream)_sslconnection;
int bytes = -1;
int nextread = 0;
int byteslefttoread = -1;
byte[] tmpMessage;
byte[] buffer = new byte[3000000];
do
{
bytes = _sslStream.Read(buffer, nextread, 8192);
int packetSize = BitConverter.ToInt32(buffer, 0);
nextread += bytes;
byteslefttoread = packetSize - nextread;
if (byteslefttoread <= 0)
{
int leftover = Math.Abs(byteslefttoread);
do
{
tmpMessage = new byte[packetSize];
Buffer.BlockCopy(buffer, 0, tmpMessage, 0, packetSize);
PacketHolder tmpPacketHolder = new PacketHolder(tmpMessage, "in");
lock (StaticMessageBuffers.MsglockerIn)
{
//puts message into the message queue.. not very oop... :S
MessageInQueue.Enqueue(tmpPacketHolder);
}
}
while (leftover > 0);
Buffer.BlockCopy(buffer, packetSize , buffer, 0, leftover);
byteslefttoread = 0;
nextread = leftover;
}
} while (bytes != 0);
答案 0 :(得分:0)
如果您使用.Net 3.5或更高版本,我强烈建议您查看Windows Communication Foundation (wcf)。它只是你想通过网络做的任何事情。
另一方面,如果你这样做纯粹是出于教育目的。 看看this link。您最好的选择是以较小的增量读取流,并将该数据提供给另一个流。一旦您可以确定消息所需的数据长度,就可以将第二个流切换为消息。您可以设置一个外部循环,其中检查可用字节并等待其值为&gt; 0开始下一条消息。还应注意,任何网络代码都应该在自己的线程上运行,以免阻塞UI线程。