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

时间:2015-07-06 19:45:49

标签: c# asp.net sockets asynchronous websocket

我正在尝试理解和处理可以关闭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'代替以保持能够接收   数据但关闭输出通道。“

那么如何在服务器端知道客户端是否正在尝试干净地关闭连接?

1 个答案:

答案 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;
            }