如果我正确理解 API,它会在必要时为您提供多个部分的 websocket 消息。
这意味着如果从服务器发送的消息是 2048 字节,并且您使用 1000 字节的缓冲区并执行以下操作:
var buffer = new ArraySegment<byte>(new byte[1000]);
var result = await client.ReceiveAsync(buffer, token);
然后在第一次调用result.Count
中将设置为 1000 并将result.EndOfMessage
设置为false
. 这意味着您需要继续阅读,直到EndOfMessage
设置为 true,这意味着此示例需要 3 次阅读。
如果您需要一个缓冲区中的所有内容并且无法单独处理消息片段,您可以从一个小缓冲区开始,如果结果告诉您有更多数据进入,则调整接收缓冲区的大小。因此您还可以检查是否有超过最大尺寸 接收停止。
int bufferSize = 1000;
var buffer = new byte[bufferSize];
var offset = 0;
var free = buffer.Length;
while (true)
{
var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer, offset, free), token);
offset += result.Count;
free -= result.Count;
if (result.EndOfMessage) break;
if (free == 0)
{
// No free space
// Resize the outgoing buffer
var newSize = buffer.Length + bufferSize;
// Check if the new size exceeds a limit
// It should suit the data it receives
// This limit however has a max value of 2 billion bytes (2 GB)
if (newSize > maxFrameSize)
{
throw new Exception ("Maximum size exceeded");
}
var newBuffer = new byte[newSize];
Array.Copy(buffer, 0, newBuffer, 0, offset);
buffer = newBuffer;
free = buffer.Length - offset;
}
}
当然,您还应该检查接收结果中的其他字段,例如MessageType
.