zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
    以上是自学中的总结,如有错误,请大家多多纠正
  • 相关阅读:
    类和接口的区别
    ref 和out的区别
    重载 重写 多态区别
    UML种类与类的关系
    Window.open() 全攻略
    C#委托
    RT Diagnostics Routines
    tar.bz2 解压命令。
    教你10招最有效防电脑辐射方法
    预处理,编译, 优化, 汇编, 链接
  • 原文地址:https://www.cnblogs.com/dachuang/p/15628223.html
Copyright © 2011-2022 走看看