Я реализовал 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);
}
}