1. 程式人生 > 其它 >C#客戶端使用SocketIO初步瞭解總結(SocketIoClientDotNet)

C#客戶端使用SocketIO初步瞭解總結(SocketIoClientDotNet)

1.介紹:Socket.io是一個WebSocket庫,它是對websocket的更高層的封裝,包括了客戶端的js和伺服器端的nodejs,它的目標是構建可以在不同瀏覽器和移動裝置上使用的實時應用。它會自動根據瀏覽器從WebSocket、AJAX長輪詢、Iframe流等等各種方式中選擇最佳的方式來實現網路實時應用,非常方便和人性化,而且支援的瀏覽器最低達IE5.5

2.使用簡介

string url = SysConfig.ServerUrl_IO;
Socket socket = IO.Socket(url, new IO.Options()
{
Transports = ImmutableList.Create("websocket"),//設定socketio一直保持websocket連線,而不自動選擇其他更優連線(如長輪詢連線等)
Reconnection = true,//重連
Timeout = 60000,//超時時間毫秒
ReconnectionAttempts = 500000,//重連最大次數
AutoConnect = false,//是否自動連線,測試發現這個true和false都一樣,不知道咋回事
QueryString = "computerId=" + SysConfig.LocalComputerId,//傳送給服務端的資訊
Upgrade = false//升級,不知道是幹啥的
});

連線後,就是監聽各種事件了,監聽方式是socket.on這種方式,監聽的事件分兩種,1種是內定的事件,如Connect,Message,Disconnect,Reconnect等,可以通過socket.出來,另一種是雙方內定的自定義事件名。

例如:

//連線成功監聽事件

socket.On(Socket.EVENT_CONNECT, (data) =>
{

  //傳送給服務端告知已連線
  socket.Emit(“msg”,"我是客戶端,我上線了");

});

//雙方自定義事件

socket.On("eamsEvent", (data) =>
{

  //監聽eamsEvent事件的訊息

}

3.說完監聽該說傳送了,傳送格式是socket.Emit,這個傳送的使用和監聽類似,一般兩個引數,事件名和引數,不過需要注意的是,引數必須是string或JObject(Newtonsoft.Json中的)

例如:socket.Emit(“msg”,"我是客戶端,我上線了");或socket.Emit('msg', {rp:"fine,thank you"}); //向伺服器傳送訊息

4.另外還有服務端使用的,包括廣播訊息,分組等,我連線不多,直接貼個別人的連線

https://www.cnblogs.com/lxxhome/p/5980615.html

https://iowiki.com/socket.io/socket.io_event_handling.html

5.還有使用中的坑,剛開始用,還沒遇到,也是百度中看到的,記錄下,備用

關於SocketIoClientDotNet坑的問題

  在實際的使用過程中,偶然發現在程式開了很久 之後,執行緒數會一直增多,嘗試調節各種引數都毫無作用,最後只能無奈的跟蹤原始碼部分,在Thread資料夾下找到Heartbeat_net35.cs檔案中,發現run方法裡的while一直無法跳出去,並且註冊DoWork越來越多,如下所示,導致執行緒越來越多,目前解決辦法是將該程式碼註釋掉,還沒發現什麼問題,如果有哪位知道這段程式碼作用的話,望告知,謝謝

usingSystem; usingSystem.ComponentModel; usingSystem.Threading; namespaceQuobject.EngineIoClientDotNet.Thread { publicclassHeartbeat { privatevolatileboolgotHeartbeat =false; privateBackgroundWorker heartBeatTimer=newBackgroundWorker(); privateCancellationTokenSource ts; privateHeartbeat() { ts =newCancellationTokenSource(); } publicstaticHeartbeat Start(Action onTimeout,inttimeout) { Heartbeat heartbeat =newHeartbeat(); heartbeat.Run(onTimeout, timeout); returnheartbeat; } publicvoidOnHeartbeat() { gotHeartbeat =true; } privatevoidRun(Action onTimeout,inttimeout) { heartBeatTimer =newBackgroundWorker(); heartBeatTimer.DoWork += (s, e) => { while(!ts.IsCancellationRequested) { System.Threading.Thread.Sleep(timeout); if(!gotHeartbeat && !ts.IsCancellationRequested) { onTimeout(); break; } } }; heartBeatTimer.RunWorkerAsync(); } publicvoidStop() { ts.Cancel(); } } } 以上是自學中的總結,如有錯誤,請大家多多糾正