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越来越多,如下所示,导致线程越来越多,目前解决办法是将该代码注释掉,还没发现什么问题,如果有哪位知道这段代码作用的话,望告知,谢谢

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

}

}

}

以上是自学中的总结,如有错误,请大家多多纠正