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

本地应用程序:部署在局域网内(可以联通外网),主要负责相关数据获取
Web浏览器端:跟本地应用程序不是处于同一个网络,请求发起方
中转服务(重点):中转服务集成认证功能,必须经过认证的客户端才允许进行连接,并且对于客户端要有唯一指定的ID进行连接操作
整体思路如以上的流程图,由Web浏览器端开始发起请求,Web浏览器端通过连接中转服务,将信息发送给指定的本地应用程序,应用程序处理完成后,将结果通过原路径进行一个反馈
二、客户端程序开发
客户端SDK采用SocketIoClientDotNet,这是一个github上开源的,可以连接socket.io的客户端,支持.net 3.5及以上,可以方便的帮助我们进行连接socket.io的开发
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
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注意点:
- emit的数据必须为字符串或者JObject(Newtonsoft.Json中的)
- 从实际情况来看,内部每个On的监听都是维护了一个线程,所有如果是不想要阻塞的话,那在on的方法中还需要自己起线程去完成
- 如果不在options中设置AutoConnect=false的话,那实例化socket成功之后就会进行connect动作
三、关于SocketIoClientDotNet坑的问题
在实际的使用过程中,偶然发现在程序开了很久 之后,线程数会一直增多,尝试调节各种参数都毫无作用,最后只能无奈的跟踪源码部分,在Thread文件夹下找到Heartbeat_net35.cs文件中,发现run方法里的while一直无法跳出去,并且注册DoWork越来越多,如下所示,导致线程越来越多,目前解决办法是将该代码注释掉,还没发现什么问题,如果有哪位知道这段代码作用的话,望告知,谢谢
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
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后台开发,开始接触微服务、docker等互联网相关
socket.io框架的更多相关文章
- .net下使用socket.io随笔记录
一.问题背景 目前公司在互联网产品上需要程序与前端部分要进行一个实时交互,在进行一定程度上的选型后,决定使用socket.io框架进行一个实践,算是公司的一个新的 尝试,也算是给自己增加增长见闻,由于 ...
- koa+mysql+vue+socket.io全栈开发之web api篇
目标是建立一个 web QQ的项目,使用的技术栈如下: 后端是基于koa2 的 web api 服务层,提供curd操作的http接口,登录验证使用的是 json web token,跨域方案使用的是 ...
- 即时通信WebSocket 和Socket.IO
WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...
- Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架
一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...
- 【Spring Boot】集成Netty Socket.IO通讯框架
服务端 @Configuration public class NettySocketConfig { private static final Logger logger = LoggerFacto ...
- 基于事件驱动的前端通信框架(封装socket.io)
socket.io的使用可以很轻松的实现websockets,兼容所有浏览器,提供实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验.但是在使用socket.io的过程中,由于业务需求需要同 ...
- websocket与socket.io
什么是Websocket? Websocket是一个独立于http的实时通信协议,最初是在HTML5中被引用进来的,在HTML5规范中作为浏览器与服务器的核心通信技术被嵌入到浏览器中.WebSocke ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- Node.js、Express、Socket.io 入门
前言 周末断断续续的写了第一个socket.io Demo.初次接触socket.io是从其官网看到的,看着get started做了一遍,根据官网的Demo能提供简单的服务端和客户端通讯. 这个De ...
随机推荐
- MySQL的并发控制与加锁分析
本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty read),幻读(phantom read ...
- WPFの获取任意元素的位置
如果布局在Grid中: 方法一: //_stackPanel为子元素,_grid为父元素 Point point = _stackPanel.TranslatePoint(new Point(0, 0 ...
- Scala 类型界定
class User(val userName: String,val age: Int) extends Comparable[User] { override def compareTo(o: U ...
- 最近公共祖先(LCA)模板
第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行 ...
- 【转】android笔记--保存和恢复activity的状态数据
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会 ...
- 转载 SpringMVC详解(二)------详细架构
目录 1.SpringMVC 详细介绍 2.SpringMVC 处理请求流程 3.配置前端控制器 4.配置处理器适配器 5.编写 Handler 5.配置处理器映射器 6.配置视图解析器 7.Disp ...
- 3990 [模板]矩阵快速幂 洛谷luogu
题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...
- Android TextView的属性设置为textstyle="bold"时 中文的“¥”不显示
昨天在修改列表的时候出现了一个挺让人纠结的问题.在TextView中“¥”符号无论如何也显示不出来.尝试了使用气的特殊符号,都是能够正确显示的. 最后百度google了一圈也没找出个所以然来.于是觉得 ...
- Android 解决在初次打开Activity加载布局文件时,ScrollView滚动条不在顶部的问题
出现这种问题的情况列举:ScrollView中嵌套有(包括自定义)的ListView,GridView时,会出现这种情况 解决办法: 1.在布局加载时让ScrollView上面的那个控件聚焦,具体做法 ...
- Android应用更新-自动检测版本及自动升级
原文 http://www.cnblogs.com/keyindex/articles/1819504.html 注:实质,把自己新版的APK放在可以下载的地方,先自己设置个通信,检查版本,我是直接放 ...