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();
            }
        }
    }
    以上是自学中的总结,如有错误,请大家多多纠正
  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/dachuang/p/15628223.html
Copyright © 2011-2022 走看看