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();
        }
    }
}
以上是自学中的总结,如有错误,请大家多多纠正
posted @ 2021-12-01 11:37  卡萨丁·周  阅读(3943)  评论(0编辑  收藏  举报