c# - 处理关闭/断开 Web 套接字连接(CloseAsync 与 CloseOutputAsync)

Pip*_*ine 3 c# sockets asp.net asynchronous websocket

我试图理解和处理关闭网络套接字连接的不同方式。来自msdn

您可以对客户端启动的请求和服务器启动的请求使用 CloseAsync 和 CloseOutputAsync 方法来关闭 AspNetWebSocket 连接。这两个方法以相同的方式处理客户端发起的请求:客户端向服务器发送关闭连接的消息后,服务器调用其中一个方法并向客户端发送确认,然后该方法返回。

对于服务器发起的请求,这两种方法的工作方式不同。CloseAsync 方法向客户端发送消息以关闭连接,等待响应,然后返回。服务器不等待客户端发送的任何附加数据。相反,CloseOutputAsync 方法向客户端发送消息以关闭连接并返回,而不等待响应。该方法返回后,您可以调用 ReceiveAsync 方法并处理其他数据或客户端发送的确认。

在我的应用程序中,客户端基本上坐在那里接收来自服务器的更新,但除了打开连接之外从未实际向服务器发送任何内容。然而,客户端还需要能够从他们这边关闭连接。

基本上,服务器的角色是坐在那里等待打开连接,发送一堆内容,并处理客户端关闭连接(但永远不必决定是否关闭连接)。

所以无论如何,当我们谈论干净地关闭连接时,客户端需要向服务器发送一条消息,表示它想要关闭连接,对吗?

所以客户需要做类似的事情:

var x = await closeAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None)
Run Code Online (Sandbox Code Playgroud)

服务器如何知道客户端执行了closeAync?我尝试使用以下命令将一段数据从服务器发送到客户端:

await sendAsync(new ArraySegment<byte>(infoBytes), 1, false, cancelled);
Run Code Online (Sandbox Code Playgroud)

并收到错误:

“调用 WebSocket.CloseAsync 后,收到的消息类型“文本”无效。仅当预计远程终结点不再有数据时,才应使用 WebSocket.CloseAsync。使用“WebSocket.CloseOutputAsync”来保持能够接收数据但关闭输出通道。”

那么,在服务器端我如何知道客户端是否正在尝试彻底关闭连接呢?

Adi*_*Adi 6

在服务器端:

 var result = await webSocket.ReceiveAsync(buffer, cancellationToken);

            if (result.MessageType == WebSocketMessageType.Close)
            {
                await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Closed in server by the client", CancellationToken.None);
                return null;
            }
Run Code Online (Sandbox Code Playgroud)