Моя цель - создать базовое приложение для чата с использованием веб-сокетов.У меня настроен клиент, однако я получаю конкретное исключение каждый раз, когда пытаюсь получить текст на стороне клиента.
Получаю следующее исключение:
Тип буфера '166' недопустим.Допустимые типы буфера: «Закрыть», «BinaryFragment», «BinaryMessage», «UTF8Fragment», «UTF8Message»
Я получаю это исключение в следующей строке кода var socketResult = await _socket.ReceiveAsync(segment, CancellationToken.None);
в приведенном ниже коде:
private readonly ClientWebSocket_socket;
private async Task ListenAsync(Action<string> textReceived)
{
while (_socket.State == WebSocketState.Open || _socket.State == WebSocketState.CloseSent)
{
var buffer = new byte[1024];
var segment = new ArraySegment<byte>(buffer, 0, buffer.Length);
var socketResult = await _socket.ReceiveAsync(segment, CancellationToken.None); // problem occurs here
if (socketResult.MessageType == WebSocketMessageType.Close)
{
await _socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
break;
}
var text = Encoding.UTF8.GetString(buffer, 0, socketResult.Count);
textReceived(text);
}
}
что я делаю не так?Подобный код прекрасно работает для получения текста на стороне сервера.
РЕДАКТИРОВАТЬ:
Сервер отлично слушает, и метод _socket.ReceiveAsync
работает, как ожидалось.Он ожидает публикации сообщения и только затем переходит к ответу.Если я не слушаю на стороне клиента, все работает.Однако когда я запускаю сервер для прослушивания клиентских сообщений, а затем запускаю клиент для прослушивания, клиент обрывается.Я попытался отправить сообщение сначала от клиента, а затем начал прислушиваться к ответу, и я все еще испытываю то же самое.Ниже описан метод, который я использую для прослушивания на стороне сервера.
private static WebSocket _socket;
public async Task ListenAsync()
{
while (_socket.State == WebSocketState.Open || _socket.State == WebSocketState.CloseSent)
{
var buffer = new byte[1024];
var segment = new ArraySegment<byte>(buffer, 0, buffer.Length);
var socketResult = await _socket.ReceiveAsync(segment, CancellationToken.None);
if (socketResult.MessageType == WebSocketMessageType.Close)
{
await _socket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
break;
}
var text = Encoding.UTF8.GetString(buffer, 0, socketResult.Count);
await PublishAsync($"Server received the following text: {text} @ {DateTime.Now:g}");
}
}
Этот метод используется для публикации сообщений с сервера.
public async Task PublishAsync(string text)
{
var bytes = Encoding.UTF8.GetBytes(text);
var buffer = new ArraySegment<byte>(bytes, 0, bytes.Length);
await _socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}