簡體   English   中英

c# - 處理關閉/斷開 Web 套接字連接(CloseAsync 與 CloseOutputAsync)

[英]c# - Handling closing/disconnecting web socket connections (CloseAsync vs CloseOutputAsync)

我試圖了解和處理關閉網絡套接字連接的不同方式。 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);

並收到一個錯誤:

“在調用 WebSocket.CloseAsync 后,接收到的消息類型 'Text' 無效。僅當遠程端點沒有更多數據時才應使用 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;
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM