最近在研究 .net 的.net websocket
服務器端設定一個超時,如果服務端在120內沒有接受到客戶端的任何資訊,將跳出回圈,終止監聽,關閉socket
我做測驗,客戶端直接關閉行程,服務器端沒有檢測到斷開,應該在120秒內結束任務,但不知道為什么一直不執行,
CancellationTokenSource 不起作用,我的環境是 vs2017 系統 server2012
哪位大神做過這一塊,幫小弟指點一下
回圈監聽
while (socket.State == WebSocketState.Open)
{
CancellationTokenSource source = new CancellationTokenSource(120 * 1000); //120秒超時
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, source.Token);
if (source.IsCancellationRequested)
{
WriteLog("WebSocket監聽超時120秒");
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure,
String.Empty, CancellationToken.None);
source.Dispose();
break; //獲取的訊息是關閉,跳出回圈
}
source.Dispose();
if (result.MessageType == WebSocketMessageType.Close)
{
WriteLog("WebSocket接收到關閉訊息");
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure,
String.Empty, CancellationToken.None);
break; //獲取的訊息是關閉,跳出回圈
}
#region 訊息處理(字符截取、訊息轉發)
。。。。。
。。。。。
#endregion
}
uj5u.com熱心網友回復:
你除錯跟蹤一下,是不是你的Socket沒有關閉,所以才進不去。斷點放在你關閉Socket的地方。uj5u.com熱心網友回復:
什么編程思路,現在還有回圈?只有初學者才會以為程式主程序都是一個大回圈。現在正常的程式,都是讓你注冊一個委托的思路。例如 websocket 服務框架,通常會讓你寫類似
server.OnMessage(socket=>{.......});
server.OnOpen(socket=>{......});
server.OnError(socket=>{........});這類代碼。
uj5u.com熱心網友回復:
嗯,使用 async/await,那么 await 本身就是回呼,執行到 await socket.ReceiveAsync(buffer, source.Token) 這里的時候這個程序就結束了,然后過一會兒才會又讓(某個執行緒池中的)執行緒從 await 左邊和后邊的代碼開始執行。通常你的超時判斷和關閉 socket 物件連接的代碼應該在其它執行緒來處理,而不是在 await 后邊去處理。uj5u.com熱心網友回復:
你說的這叫什么話?????
你自己都說了用什么 WebSocket 服務框架... 我就不用框架我就手擼 WebSocket 監聽我自己封裝 WebSocket 行不行???? 你不用回圈不用三方組件你給我寫一個 WebSocket 監聽我看看唄??? 問你什么你就答什么不行嗎? yygq 有意思???????
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/245456.html
標籤:.NET技術前瞻
上一篇:c#呼叫c++動態庫的問題
