0

我使用 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);
        }
    }
4

0 回答 0