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