一、问题背景

目前公司在互联网产品上需要程序与前端部分要进行一个实时交互,在进行一定程度上的选型后,决定使用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();

}

}

}

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


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

.NET下使用socket.io随笔记录相关推荐

  1. JAVA IO 随笔记录

    2019独角兽企业重金招聘Python工程师标准>>> 1.实现serializable的类,及其子类都可以被序列化. transient 标记的字段,在序列化时会被忽略. http ...

  2. 使用express、react、webpack打包、socket.io、mongodb、ant.design、less、es6实现聊天室

    拿到一个项目,我们应该如何去完成这个项目呢. 是直接上手? 还是先进行分析,然后再去解决呢?毫无疑问,如果直接上手解决,那么可能会因为知道目标所在,而导致出现各种问题. 所以,我们应该系统的分析这个项 ...

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

    一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...

  4. Nodejs+socket.io搭建WebRTC信令服务器

    前言 我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了. 对于 WebRTC 来说,它有一整套规范,如使它使用的接口.使用SDP进行媒体协商.通过ICE收集地址并 ...

  5. express+socket.io 共享session

    express下socket.io使用session验证用户 作者: littlejim 时间: April 23, 2015 分类: node.js express下使用socket.io来传输用户 ...

  6. php做群聊功能,使用socket.io 实现群聊天室

    本篇向大家分享一个socket.io的使用实例,实现群聊天的功能.如果想使用socket.io那么必须借助于nodejs来实现服务端,因此我们需要在nodejs中安装socket.io 安装socke ...

  7. socket.io client + socketio-netty server简析

    一. 背景: 现在实时web消息推送一般会用到websocket,但是由于此技术并没有推广开来,所以各浏览器对其支持也不同,例如下图显示了各类浏览器的支持情况. 粉红色区域表示不支持Websocket ...

  8. 关于Socket.IO的知识点记录

    最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在expres ...

  9. mac protobuf java_mac 下 使用 protobuf 生成 java 及 js 及配合socket.io 使用

    定义一个ProtoBuf源文件,gps_data.proto syntax = "proto3"; message gps_data { int64 id = 1; string ...

最新文章

  1. mysql插入性能_mysql 数据量大时插入和查询性能
  2. Hyper-V 内存管理必须知道的
  3. scanf格式控制符
  4. Leetcode 141. 环形链表 解题思路及C++实现
  5. 基于Kaggle数据的词袋模型文本分类教程
  6. 运维监控之Nagios实战(五)Nagios QL3.11
  7. Asp.Net MVC4.0 官方教程 入门指南之一-- 入门介绍
  8. 851. 喧闹和富有
  9. 计算机考试vb试题英语成绩,计算机二级考试vb试题_vb试题及参考答案
  10. C语言打印金字塔,菱形,V形图案
  11. win7计算机管理没有用户模块,Win7系统安装“ipx协议”提示“找不到相应的模块”如何解决...
  12. Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量
  13. excel打不开_卸载WPS以后为什么无法打开一个新建的Excel工作簿了
  14. 永洪科技怎么样_「永洪科技」
  15. PageRank实践-博客园用户PageRank排名
  16. 使用vue-admin-template搭建简单增删改查导入导出项目及CentOs服务器部署
  17. 主动求变,苏宁易购如何破局2022?
  18. 6个非常实用的 Python 代码块,适合收藏~
  19. vue使用JavaScript的Number方法或正则表达式进行表单验证,判断值是否为数字(包括整数和小数),验证值只能为小数点后一位
  20. stm32cubx-usb-hid键鼠

热门文章

  1. 小程序 - 学习笔记
  2. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程
  3. 使用ABBYY FineReader进行自动图像预处理
  4. 异常检测之浅谈入侵检测
  5. android笔记之在WebView中显示ProgressBar的两种方法
  6. Servlet学习一
  7. 第二十五章补充内容 5 不能为0的变量
  8. MFC多语言实现方法
  9. 转:PostgreSQL角色、用户、权限和数据库安全
  10. C#解析Markdown文档,实现替换图片链接操作