【发布时间】:2017-06-01 16:34:18
【问题描述】:
谁能解释我如何从意外终止连接的客户端中删除 websocket? 我的意思是用户以一种糟糕的方式关闭了应用程序,而没有告诉服务器他们想要断开连接? 以及您通常如何处理断开连接。
我尝试了一段代码来监听消息接收并且有一个 3s 的 cancelTokenSource,所以它会检查连接是否仍然存在。当我关闭 websocket 客户端应用程序时,服务器不会转到 WebSocketState.Closed 部分,并且当触发取消令牌时,服务器会断开我与客户端的连接。我在这里做错了什么?! 提前致谢!
while (socket.State == WebSocketState.Open)
{
var cancellationSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(3000));
buffer = new ArraySegment<byte>(new byte[4096]);
WebSocketReceiveResult received = null;
try
{
received = await socket.ReceiveAsync(buffer, cancellationSource);
}
catch (AggregateException e)
{
continue;
}
switch (received.MessageType)
{
case WebSocketMessageType.Close:
HandleClose(socket);
break;
case WebSocketMessageType.Text:
// Handle text message
break;
}
}
if (socket.State == WebSocketState.Aborted)
{
// Handle aborted
}
else if (socket.State == WebSocketState.Closed)
{
HandleClose(socket);
}
else if (socket.State == WebSocketState.CloseReceived)
{
}
else if (socket.State == WebSocketState.CloseSent)
{
}
【问题讨论】:
-
如果客户端意外关闭 TCP 连接,TCP 栈最终会通知应用层,但不会在正确的协议完成之前。这些协议因用户结束连接的方式而异。请记住,TCP 会尝试保持连接,并且会根据重试时间重试多达 10 次。如果客户端以客户端 TCP 端发送 RST 或 FIN 的方式关闭,则堆栈将按优先级顺序开始清理。完成后,应用程序会收到通知。
-
@JohnPeters,感谢您的回答!您认为它适合实时游戏服务器还是只是坚持旧的和精细的方式,udp 套接字?
-
您找到合适的解决方案了吗?我有同样的问题
-
@Gabrielkotev 你找到解决办法了吗?
-
不。不幸的是我现在离开了:(
标签: c# websocket asp.net-core