.net下使用socket.io随笔记录

一、问题背景

目前公司在互联网产品上需要程序与前端部分要进行一个实时交互,在进行一定程度上的选型后,决定使用socket.io框架进行一个实践,算是公司的一个新的 尝试,也算是给自己增加增长见闻,由于我是做后端以及桌面程序开发,所以前端部分就不细聊,主要是针对桌面程序如何连接socket.io进行一个尝试

二、基本逻辑图

  本地应用程序:部署在局域网内(可以联通外网),主要负责相关数据获取

  Web浏览器端:跟本地应用程序不是处于同一个网络,请求发起方

  中转服务(重点):中转服务集成认证功能,必须经过认证的客户端才允许进行连接,并且对于客户端要有唯一指定的ID进行连接操作

  整体思路如以上的流程图,由Web浏览器端开始发起请求,Web浏览器端通过连接中转服务,将信息发送给指定的本地应用程序,应用程序处理完成后,将结果通过原路径进行一个反馈

二、客户端程序开发

  客户端SDK采用SocketIoClientDotNet,这是一个github上开源的,可以连接socket.io的客户端,支持.net 3.5及以上,可以方便的帮助我们进行连接socket.io的开发

 Socket  socket = IO.Socket("ws://192.168.7.4:3000", new IO.Options()
            {
                Reconnection = true,
                Cookies = new Dictionary<string, string>() { { "companyId", GlobalStatic.COMPANY.COMPANY_ID }, { "userId", GlobalStatic.UserDomain.user.USER_ID } },
                Timeout = 60000,
                ReconnectionDelay = 1000,

                Transports = new List<string>() { "websocket" },
                Path ="heart"
            });

            socket.On(Socket.EVENT_CONNECT, () =>
            {

                JObject jObject = JObject.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(new
                {
                    companyId = GlobalStatic.COMPANY.COMPANY_ID,
                    token = GlobalStatic.TOKEN,
                    hostId = GlobalStatic.HOST_ID,
                    hostName = GlobalStatic.HOST_NAME,
                    printerNames = GlobalStatic.HOSTINFO.PrinterName,
                    source = "assistant",
                    userId = GlobalStatic.UserDomain.user.USER_ID
                }));
                socket.Emit("authentication", jObject);
                Debug.WriteLine("authentication");
            });
            socket.On(Socket.EVENT_DISCONNECT, (data) =>
            {
                Debug.WriteLine("心跳断开连接" + data);
                flag = false;
                OnConnectionStatus?.Invoke(flag);
                socket.Disconnect();
            });
            socket.On("authenticated", (obj) =>
            {
                flag = true;
                OnConnectionStatus?.Invoke(flag);
                Debug.WriteLine("心跳认证成功:" + obj);
            });
            socket.On("unauthorized", (obj) =>
            {
                Debug.WriteLine("心跳认证失败" + obj);
                socket.Disconnect();
            });

SocketIoClientDotNet注意点:

  1. emit的数据必须为字符串或者JObject(Newtonsoft.Json中的)
  2. 从实际情况来看,内部每个On的监听都是维护了一个线程,所有如果是不想要阻塞的话,那在on的方法中还需要自己起线程去完成
  3. 如果不在options中设置AutoConnect=false的话,那实例化socket成功之后就会进行connect动作

三、关于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();
        }
    }
}

  

作者: Mango

出处: http://www.cnblogs.com/OMango/

关于自己:专注.Net桌面开发以及Web后台开发,开始接触微服务、docket等互联网相关

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件([email protected])咨询.

p,li { white-space: pre-wrap }

原文地址:https://www.cnblogs.com/OMango/p/8443395.html

时间: 2024-08-04 07:25:09

.net下使用socket.io随笔记录的相关文章

express4下socket.io的验证

node实战里面有socket.io+angular.js的聊天室例子,但是现在express和socket.io的版本都发生了不小的变化,自己写了个express4下的socket.io验证 不废话,贴代码 var express = require('express'); var path = require('path'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bo

Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架

一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket的协议用于实时通信.跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js. Socket.IO除了支持WebSocket通讯协议外,还支持许多种轮询(Polling)机制以及其它实时通信方式,并封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码.Socket.I

关于Socket.IO的知识点记录

最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在express框架路由.模板渲染那里看到了Yii2的影子,所以便更加的亲切了.再接着便接触到了websocket,而今天谈论的socket.io 便是websocket的一个类库,说道这里了,我们先去了解下websocket和socket.io: 一  websocket WebSocket是html5新增加的

推送服务之socket.io

一.作者自述 从事软件开发3年了,出于各种原因(其实是因为我懒,啊哈哈~),第一次决定动手写点什么.第一呢,给自己一个总结的机会,梳理下自己的知识库.第二呢,同第一点... 自从大学毕业后,一直处于一种"极度"的繁忙之中.从刚开始入行时各种学习的"饥渴"状态,到后来工作需要的"填鸭"状态,一直在学,一直在用,边用边学.刚开始接触的知识面比较窄,但随着工作的变换,能力的提升,接触的东西越来越多了.慢慢的,自己越来越感觉知识杂乱,缺乏梳理.因此,决定

使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方

Node.js websocket 使用 socket.io库实现实时聊天室

认识websocket WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duple).一开始的握手需要借助HTTP请求完成. 其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http . 之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket的通信,要想做一个好的聊天室,我觉得大部

Socket.IO聊天室

小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ Socket.IO聊天室 简介:Socket.IO实现了实时双向的基于事件的通讯机制.旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制.下面我们使用Node.js和Socket.IO来做一个简单的聊天室.一.初始化项目 (这个是在实验楼网站的虚拟平台需要实现的~可自动略过这一环节,

使用socket.io+redis来实现基本的聊天室应用场景

本文根据socket.io与redis来实现基本的聊天室应用场景,主要表现于多个浏览器之间的信息同步和实时更新. 首先看下基本的应用场景:多个浏览器同时跟webServer连接,可实时获取webServer推送的数据,如显示某一项实时更新的数据,多个client之间同步消息等. 这里,需要使用到socket.io和redis的publish机制. 1, socket.io连接于浏览器和nodejs的http服务器之间,可用于二者之间同步数据. 2, redis是一种key-value的数据库,可

使用Node.js+Socket.IO搭建WebSocket实时应用

Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. 作者:潘良虎链接:https://www.zhihu.com/question/20215561/answer/26419995来源:知乎原文地址:http://www.plhwin.com/2014/05/28/nodejs-socketio/ WebSocket简介 谈到Web实时推送,就不得不说