2

我正在开发一个 C# Asp.NET Core 应用程序,其中客户端将通过 JavaScript WebSocket 连接到服务器,而服务器本身将是唯一可以向连接的客户端发送消息的东西。

客户端不会将消息发送回服务器,如果他们设法通过在任何浏览器控制台中手动发送消息到服务器,服务器将忽略它们。

这是我用来向所有连接的客户端发送消息的 C# 代码示例:

foreach(WebSocket webSocket in WebsocketHandler.WebSocketClients.Values)
{
    await webSocket.SendAsync(...);
}

由于我不希望客户端将消息发送回服务器(因为这应该是单向消息流),因此后续调用:

await webSocket.ReceiveAsync(...);

在调用“SendAysnc()”后立即需要吗?调用“SendAsync()”后不调用“ReceiveAsync()”的缺点/后果是什么?

我在 MS 的文档中找不到任何内容说在调用“SendAsync()”之后需要调用“ReceiveAsync”(尽管大多数在线示例都这样做)并且两种方法(根据 MS 文档)都声明“此操作不会堵塞。”

我在这里主要关心的是,是否持续只发送消息而不接收任何返回可能会导致许多“SendAsync()”调用堆积的内存泄漏,因为它期望一些“响应”返回或服务器断开客户端( s) 因为没有消息从通信通道的另一端发回,服务器认为客户端已经掉线。

问候。

4

1 回答 1

1

您需要调用 ReceiveAsync 以便检测 websocket 何时关闭,以便完成关闭握手。通常,当直接使用 websockets 时,您将有 2 个并行运行的异步循环,接收循环和发送循环(或者您可以像您正在做的那样移交套接字以发送)。您还需要确保执行 websocket 升级的请求继续运行,以便连接不会关闭,并且在您的场景中,您可以为此目的使用接收循环​​。

于 2021-06-04T04:41:20.380 回答