Базовый чат WebSocket - PullRequest
       48

Базовый чат WebSocket

0 голосов
/ 19 сентября 2019

Моя цель - создать базовое приложение для чата с использованием веб-сокетов.У меня настроен клиент, однако я получаю конкретное исключение каждый раз, когда пытаюсь получить текст на стороне клиента.

Получаю следующее исключение:

Тип буфера '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);
}
...