- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试理解和处理关闭 Web 套接字连接的不同方式。来自 msdn :
You can use the CloseAsync and CloseOutputAsync methods for bothclient-initiated and server-initiated requests to close anAspNetWebSocket connection. The two methods handle client-initiatedrequests in the same way: After the client sends a message to theserver to close the connection, the server calls one of these methodsand sends an acknowledgment to the client, and then the methodreturns.
For server-initiated requests, the two methods workdifferently. The CloseAsync method sends a message to the client toclose the connection, waits for a response, and then returns. Theserver does not wait for any additional data sent by the client. Incontrast, the CloseOutputAsync method sends a message to the client toclose the connection and returns without waiting for a response. Afterthe method returns, you can call the ReceiveAsync method and handleeither additional data or the acknowledgment that the client sends.
在我的应用程序中,客户端基本上坐在那里从服务器接收更新,但除了打开连接之外,实际上从不向服务器发送任何内容。然而,客户端还需要能够从他们这边关闭连接。
基本上服务器的角色是坐在那里等待打开连接,发送一堆东西,并处理客户端关闭连接(但永远不必决定是否关闭连接)。
所以无论如何,当我们谈论彻底关闭连接时,客户端需要向服务器发送一条消息,说明它想要关闭连接,对吗?
所以客户端需要做这样的事情:
var x = await closeAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None)
服务端怎么知道客户端执行了closeAync?我尝试使用以下方法从服务器向客户端发送一段数据:
await sendAsync(new ArraySegment<byte>(infoBytes), 1, false, cancelled);
并收到一个错误:
"The received message type 'Text' is invalid after callingWebSocket.CloseAsync. WebSocket.CloseAsync should only be used if nomore data is expected from the remote endpoint. Use'WebSocket.CloseOutputAsync' instead to keep being able to receivedata but close the output channel."
那么在服务器端我如何知道客户端是否正在尝试干净地关闭连接?
最佳答案
在服务器端:
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;
}
关于c# - 处理关闭/断开网络套接字连接(CloseAsync 与 CloseOutputAsync),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254353/
我知道之前也有人问过这个问题,但是我找不到解决这个问题的方法。 我有一个 Microsoft Azure 事件中心处理器 ProcessorHost,它正在实现 IEventProcessor 接口(
subscriptionClient.AbandonAsync 与 subscriptionClient.closeAsync 之间有什么区别。 我需要检查订阅客户端中是否存在主题。由于某些限制,我无
这是在 silverlight 中关闭与 WCF 连接的正确方法吗? ServiceClient client = new ServiceClient(); client.MakeRe
我正在尝试理解和处理关闭 Web 套接字连接的不同方式。来自 msdn : You can use the CloseAsync and CloseOutputAsync methods for bo
我们有一个有效的 ASP.NET Web API REST 服务,它在我们 Controller 的一个方法上使用 WebSockets,使用 HttpContext.AcceptWebSocketR
Microsoft.Azure.Devices.ServiceClient 和 Microsoft.Azure.Devices.RegistryManager 都具有 ConnectFromConne
我们对CloseAsync(PartitionContext, CloseReason)有以下实现我们的 IEventProcessor 中的方法: public async Task CloseAs
我正在将我们的 DAL 更改为 async DAL。 看着: await _conn.OpenAsync().ConfigureAwait(false); 我看到有一个用于打开连接的异步方法。但是为什
我正在使用 Microsoft.Azure.ServiceBus 包。由于我应该重用 TopicClient 来充分利用 AMQP/SBMP,因此我将在我的单例服务之一中创建它。但是,TopicCli
IMessageSession 具有 CloseAsync 和 CompleteAsync 方法。 如果未调用 CloseAsync 和 CompleteAsync(在获取 session 并处理消息
我是一名优秀的程序员,十分优秀!