.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注意点:
- emit的数据必须为字符串或者JObject(Newtonsoft.Json中的)
- 从实际情况来看,内部每个On的监听都是维护了一个线程,所有如果是不想要阻塞的话,那在on的方法中还需要自己起线程去完成
- 如果不在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后台开发,开始接触微服务、docker等互联网相关
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(hongjb@yizit.com)咨询.
.net下使用socket.io随笔记录的更多相关文章
- 使用express、react、webpack打包、socket.io、mongodb、ant.design、less、es6实现聊天室
拿到一个项目,我们应该如何去完成这个项目呢. 是直接上手? 还是先进行分析,然后再去解决呢?毫无疑问,如果直接上手解决,那么可能会因为知道目标所在,而导致出现各种问题. 所以,我们应该系统的分析这个项 ...
- socket.io 入门篇(二)
本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...
- Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架
一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...
- Java Socket IO(BIO、NIO)
总结下Java socket IO.首先是各种IO的定义,这个定义似乎也是众说纷纭.我按照stackoverflow上面的解释: IO有两种分法:按照阻塞或者按照同步.按照阻塞,有阻塞IO和非阻塞IO ...
- 实时通讯之Socket.io
WebSocket WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.使用WebSocket,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成 ...
- 关于Socket.IO的知识点记录
最近因为项目的需要,开始学习nodejs,本着js的那点儿功底,nodejs学习起来还是挺快能上手的.随着深入学习,知道了express框架并那它写了一个小功能,作为一个php程序员哈,在expres ...
- Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
- 解决Socket.IO在IE8下触发disconnect时间过长
本文地址: http://www.cnblogs.com/blackmanba/p/solve-socketIO-IE8-emit-disconnect-too-long.html或者http://f ...
- socket.io使用随笔
这段时间一直在做一个手机APP,正好使用到了socket.io.这里记录一下服务器端发送信息的几种不同方式: socket.emit('message',"this is a test&qu ...
随机推荐
- POJ 1426 Find The Multiple(数论——中国同余定理)
题目链接: http://poj.org/problem?id=1426 Description Given a positive integer n, write a program to find ...
- Redis Cluster集群搭建与应用
1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...
- 一个php技术栈后端猿的知识储备大纲
<h1 align="center">Easy Tips</h1><p align="center"><a href= ...
- Thrift之TProtocol系列TBinaryProtocol解析
首先看一下Thrift的整体架构,如下图: 如图所示,黄色部分是用户实现的业务逻辑,褐色部分是根据thrift定义的服务接口描述文件生成的客户端和服务器端代码框架(前篇2中已分析了thrift ser ...
- PowerDesigner设置null约束
在PDM的表属性的字段列表中每行最后的P,F,M中的M(Mandatory)打勾就可以了,这样在生成的SQL中会变成not NULL Mandatory:强制的,不知道是不是可以理解为必须赋值的
- 用IDEA/WebStrom 提交本地项目到Git/码云等
以码云为例: 在码云上创建新的项目. webstrom/idea 打开本地项目
- ASP.NET导出word实例
ASP.NET导出word实例 最近遇到一个题目就是如何在asp.net中将数据导出到word中,由于数据是动态的,所以需要在后台拼出想要的的格式,翻遍了网页找出了一个比较满意的代码,感谢那位高手.代 ...
- Redis 2种持久化模式的缺陷
http://blog.csdn.net/hexieshangwang/article/details/47254087 一.RDB持久化模式缺陷 1.问题描述: 并发200路,模拟不断写Redis, ...
- CentOS7中使用iptables
原文地址:http://blog.csdn.net/u012486840/article/details/53161555 1.关闭firewall: systemctl stop firewalld ...
- 数据存储之Web存储(sessionStorage localStorage globalStorage )
Web Storage 两个目标 提供一种在cookie之外的存储会话守数据的途径 提供一种存储大量可以跨会话存在的数据机制 最初的Web Storage规范包含两个对象 sessionStorage ...