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”来保持能够接收数据但关闭输出通道。”
那么,在服务器端我如何知道客户端是否正在尝试彻底关闭连接呢?
在服务器端:
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)
归档时间: |
|
查看次数: |
9779 次 |
最近记录: |