C# WebSocket 通过ReceiveAsync接收大数据的组包处理
WebSocket在发送大数据时会进行分包处理,因此我们在使用ReceiveAsync接收想要的数据时需要进行组包处理,确保接收到的是我们想要的完整数据。
具体示例如下:
/// <summary>
/// 确保接收完整数据
/// </summary>
/// <param name="webSocket">webSocket连接</param>
/// <param name="length">接收数据长度</param>
/// <returns>完整数据</returns>
/// <exception cref="Exception">接收数据出错</exception>
private static async Task<byte[]> SureReceiveFullData(System.Net.WebSockets.WebSocket webSocket, int length)
{
byte[] buffer = new byte[length];
var segment = new ArraySegment<byte>(buffer);
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
int count = result.Count;
while (result != null && !result.CloseStatus.HasValue)
{
if (count > buffer.Length)
{
throw new Exception("receive WebSocket data error");
}
else if (count == buffer.Length)
{
return buffer;
}
else
{
// 继续接收更多数据
byte[] temp = new byte[length - count];
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(temp), CancellationToken.None);
if (result != null && result.Count > 0)
{
Buffer.BlockCopy(temp, 0, buffer, count, result.Count);
count += result.Count;
}
}
}
if (count != length)
throw new Exception("receive WebSocket data error");
return buffer;
}