首页 > 解决方案 > 基本 WebSocket 聊天

问题描述

我的目标是使用 Web 套接字创建一个基本的聊天应用程序。我有一个客户端设置,但是每次我尝试在客户端接收文本时都会遇到一个特定的异常。

我得到的例外如下:

缓冲区类型“166”无效。有效的缓冲区类型是:'Close'、'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);
}

标签: c#websocket.net-4.6

解决方案


推荐阅读