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都一樣,不知道咋回事,如果這里false,可以用Open自行打開
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"}); //向服務器發送消息

  還有socket.send這個也是想服務端發送消息的,和socket.Emit的區別是,send是發送已命名事件的(message,用socket可以.出來),而Emit是用於發送未定義事件的

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越來越多,如下所示,導致線程越來越多,目前解決辦法是將該代碼注釋掉,還沒發現什么問題,如果有哪位知道這段代碼作用的話,望告知,謝謝

using  System;
using  System.ComponentModel;
using  System.Threading;
 
namespace  Quobject.EngineIoClientDotNet.Thread
{
     public  class  Heartbeat
     {
         private  volatile  bool  gotHeartbeat =  false ;
         private  BackgroundWorker heartBeatTimer=  new  BackgroundWorker();
         private  CancellationTokenSource ts;
 
         private  Heartbeat()
         {
             ts =  new  CancellationTokenSource();
         }
 
         public  static  Heartbeat Start(Action onTimeout,  int  timeout)
         {
             Heartbeat heartbeat =  new  Heartbeat();
             heartbeat.Run(onTimeout, timeout);
             return  heartbeat;           
         }
 
         public  void  OnHeartbeat()
         {
             gotHeartbeat =  true ;
         }
 
         private  void  Run(Action onTimeout,  int  timeout)
         {
             heartBeatTimer =  new  BackgroundWorker();
 
             heartBeatTimer.DoWork += (s, e) =>
             {
                while  (!ts.IsCancellationRequested)
                {
                     System.Threading.Thread.Sleep(timeout);
                     if  (!gotHeartbeat && !ts.IsCancellationRequested)
                     {
                         onTimeout();
                         break ;
                     }
                 }
             };
 
             heartBeatTimer.RunWorkerAsync();
         }
 
         public  void  Stop()
         {
             ts.Cancel();
         }
     }
}
以上是自學中的總結,如有錯誤,請大家多多糾正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM