c# - 基本 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);
}
解决方案
推荐阅读
- java - 从字符串数组生成所有可能的组合而不重复
- c++ - 我可以在类中有一个命名的 lambda 函数作为变量并尝试从主函数调用命名的 lambda 吗?
- windows - 在 Windows Docker 容器 (NSIS) 内静默安装
- python - 删除 json 文件中所有出现的键
- firebase - 无法进行 Firebase 身份验证登录
- python - 详细页面的网页设计
- instagram - 使用 Facebook 应用程序帐户或任何其他方式发送/阅读 Instagram 直接消息
- c# - 如何将内容从一个用户控件移动到另一个,windows窗体,c#
- android - 无法检索用户位置
- python - 我在使用以下命令安装 pyinstaller 时遇到问题:pip install pyinstaller