我正在尝试理解和处理可以关闭Web套接字连接的不同方法。来自msdn:
您可以对两者使用CloseAsync和CloseOutputAsync方法 客户端发起的和服务器发起的关闭请求 AspNetWebSocket连接。这两种方法处理客户端启动 请求以同样的方式:客户端发送消息后 服务器关闭连接,服务器调用这些方法之一 并向客户端发送确认,然后发送方法 回报。
对于服务器发起的请求,这两种方法都有效 不同。 CloseAsync方法向客户端发送消息 关闭连接,等待响应,然后返回。该 服务器不等待客户端发送的任何其他数据。在 相比之下,CloseOutputAsync方法向客户端发送消息 关闭连接并返回而不等待响应。后 方法返回后,可以调用ReceiveAsync方法并进行处理 附加数据或客户发送的确认。
在我的应用程序中,客户端基本上坐在那里接收来自服务器的更新,但从未在打开连接之外向服务器发送任何内容。但是,客户端还需要能够从他们身边关闭连接。
基本上,服务器的作用是坐在那里等待打开连接,发送一堆东西,并处理客户端关闭连接(但不必决定是否关闭连接)。
所以无论如何,当我们谈论干净地关闭连接时,客户端需要向服务器发送一条消息,说它要关闭连接,对吗?
因此客户需要执行以下操作:
var x = await closeAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None)
服务器如何知道客户端执行closeAync?我尝试使用以下命令从服务器向客户端发送一段数据:
await sendAsync(new ArraySegment<byte>(infoBytes), 1, false, cancelled);
并收到错误:
“调用后收到的消息类型'Text'无效 WebSocket.CloseAsync。只有在没有时才应使用WebSocket.CloseAsync 期望从远程端点获得更多数据。使用 'WebSocket.CloseOutputAsync'代替以保持能够接收 数据但关闭输出通道。“
那么如何在服务器端知道客户端是否正在尝试干净地关闭连接?
答案 0 :(得分:2)
在服务器端:
var result = await webSocket.ReceiveAsync(buffer, cancellationToken);
if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed in server by the client", CancellationToken.None);
return null;
}