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();
}
}
}