我使用 System.Net.WebSockets 实现了一个 websocket 客户端来与嵌入式设备进行通信。在设备上,libwebsocket 库正在使用中。
协议的主要部分是使用 JSON 字符串实现的,效果很好,但也需要一些二进制传输。在设备上正确接收来自 Windows 的传出二进制消息,但在传入二进制消息的情况下,ReceiveAsync() 会引发异常。
我将接收部分实现为调用 ReceiveAsync() 的异步循环。在传入二进制消息的情况下,将引发带有以下错误代码的 WebSocketException:
HResult 0x83760002
E_INVALID_PROTOCOL_FORMAT 协议数据的格式无效。
我不知道是什么原因造成的,它在我查看收到的数据之前就抛出了。它已经可以从设备接收二进制数据,但它是一个早期的实现,只循环回我发送的数据。
private async void ReceiveLoop(CancellationToken cancellationToken)
{
try
{
List<byte> receivedBytes = new List<byte>();
var buffer = new byte[c_bufferSize];
while (!cancellationToken.IsCancellationRequested)
{
var receiveBuffer = new ArraySegment<Byte>(buffer);
WebSocketReceiveResult result;
result = await _webSocket.ReceiveAsync(receiveBuffer, cancellationToken);
receivedBytes.AddRange(receiveBuffer.Array);
// message is complete, return it
if (result.EndOfMessage)
{
if (result.MessageType == WebSocketMessageType.Text)
{
String receivedString = Encoding.UTF8.GetString(receivedBytes.ToArray());
Debug.Print($"{receivedString}");
Debug.Print($"{receivedString.Length.ToString()}");
WebsocketMessage response = new WebsocketMessage(receivedString);
MessagesSubject.OnNext(response);
}
if (result.MessageType == WebSocketMessageType.Binary)
{
WebsocketMessage response = new WebsocketMessage(receivedBytes.ToArray());
MessagesSubject.OnNext(response);
}
receivedBytes.Clear();
buffer = new byte[c_bufferSize];
}
}
}
catch(OperationCanceledException ex)
{
return;
}
catch(Exception ex)
{
MessagesSubject.OnError(ex);
}
}