C # ClientWebsocket выбрасывает исключение при поступлении двоичного сообщения - PullRequest
0 голосов
/ 15 мая 2018

Я реализовал websocket-клиент, используя System.Net.WebSockets для связи со встроенным устройством.На устройстве используется библиотека 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);
        }
    }
...