前言


本文将使用一个NuGet公开的组件技术来实现数据订阅推送功能,由服务器进行推送数据,客户端订阅指定的数据后,即可以接收服务器推送过来的数据,包含了自动重连功能,使用非常方便

nuget地址:https://www.nuget.org/packages/HslCommunication/           

github地址:https://github.com/dathlin/HslCommunication                                 如果喜欢可以star或是fork,还可以打赏支持。

联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation

在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:

Install-Package HslCommunication

NuGet安装教程  http://www.cnblogs.com/dathlin/p/7705014.html

访问测试项目,客户端和服务器的源代码都在上面的地址里


下面的一个项目是这个组件的访问测试项目,您可以进行初步的访问的测试,免去了您写测试程序的麻烦,源代码也在本文开始处的项目里,

下载地址为:HslCommunicationDemo.zip

以下就是对服务器的指定关键字的数据的订阅,服务器提供了几个关键字订阅,以供测试。

  • B    随机数订阅
  • C    时间订阅
  • D    JSON数据订阅
  • E    XML数据订阅

如果该服务器不可用,请下载本地版本的服务器

PushNetServer.zip

特性支持


  • 支持数据广播,按指定的关键字来广播
  • 支持客户端断线重连
  • 支持服务器端简单的监控
  • 支持日志输出
  • 服务器支持来自其他远程的服务器数据输入,形成数据推送网络
  • 目前只支持字符串的数据推送,复杂的数据需要进行序列化,具体参照json推送和xml推送
  • 推送的客户端为C#程序,java程序,安卓程序,python程序,允许跨平台推送,跨客户端推送!

引用


ModBus组件所有的功能类都在 HslCommunication.Enthernet 命名空间,所以再使用之前先添加

using HslCommunication.Enthernet;
using HslCommunication;

  

服务器端搭建


先进行声明变量

private NetPushServer pushServer;

然后再一个启动按钮里写上如下的代码

pushServer = new NetPushServer( );
pushServer.ServerStart( 12345 );

到这里为止,服务器的代码基本已经写好了,短短的两三行代码而已。只是目前的数据并没有数据推送功能。

一个经典的情景是什么,比如你有一堆实时数据是从设备采集回来的,这些数据是在服务器上的。  你还有个客户端的软件,很多人同时在线,如果别人打开监控实时数据的话,就特别适用于本组件的方法,因为你走数据库显然是更慢的,而且对服务器压力也大。采用本组件就可以完美的解决这件事情、

假设你采集了来自设备的数据,我们做个1秒钟的定时器,然后启动定时器,模拟每秒钟的数据推送,推送什么呢?先试试看随机数

private Random random = new Random( ); // 先定义一个随机数生成器

  

定时器的代码如下:

pushServer.PushString( "A", random.Next( 1000, 10000 ).ToString( ) );

到这里为止,服务器的一个完整的代码已经写完了。我们来看看客户端怎么写

客户端端搭建


先进行声明变量

private NetPushClient pushClient;

实例化,需要指定服务器的IP和端口,还有想订阅的关键字

pushClient = new NetPushClient( "127.0.0.1", 12345, "A" );

接下来就是创建订阅了,需要指定一个调用的委托,会返回一个是否成功的信号,因为有可能网络的原因,有可能因为没有这个关键字,会导致创建失败。

OperateResult create = pushClient.CreatePush( new Action<NetPushClient, string>( PushFromServer ) );
if (create.IsSuccess)
{
MessageBox.Show( "成功" );
}
else
{
MessageBox.Show( "失败:" + create.Message );
}

上面使用了一个委托,PushFromServer的方法如下,主要是使用委托把数据显示出来:

private void PushFromServer( NetPushClient pushClient, string data )
{
if (IsHandleCreated) Invoke( new Action<string>( m =>
{
label8.Text = DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss.fff" ); // 显示接收时间
receiveCount++;
label9.Text = receiveCount.ToString( ); // 显示接收次数
textBox4.Text = m; // 数据最终显示在这里
} ), data );
}

在相应的窗口关闭之前,关闭掉客户端就可以了。如果不手动关闭,当你关闭窗口的时候,该连接很有可能仍然存在。

pushClient.ClosePush( );

  

一个简单的完整的数据订阅功能已经完成了。

复杂数据订阅


上面的代码只能推送字符串数据,怎么样实现推送复杂的数据呢,我们假设有4个数据,需要同时推送给客户端。那我们可以选择2种方式,一种是json,一种是xml,各有优缺点

JSON

            JObject json = new JObject( );
json.Add( "value1", new JValue( random.Next( 1000, 9999 ) ) );
json.Add( "value2", new JValue( Math.Round( random.NextDouble( ), 6 ) * 1000 ));
json.Add( "value3", new JValue( Guid.NewGuid( ).ToString( ) ) );
json.Add( "value4", new JValue( DateTime.Now ) ); pushServer.PushString( textBox14.Text, json.ToString( ) );

Xml

            XElement element = new XElement( "Data" );
element.SetElementValue( "value1", random.Next( 1000, 9999 ) );
element.SetElementValue( "value2", (Math.Round( random.NextDouble( ), 6 ) * 1000 ).ToString() );
element.SetElementValue( "value3", Guid.NewGuid( ).ToString( ) );
element.SetElementValue( "value4", DateTime.Now.ToString( "O" ) ); pushServer.PushString( textBox18.Text, element.ToString( ) );

解析的时候按照对应的信息解析即可。

令牌设置


服务器支持令牌设置,如果客户端无法提供一致的令牌校验,就会被拒绝连接,提升系统的安全性

pushServer.Token = new Guid( "04f6e588-4b9c-4dfb-86b2-4389742534b5" );

客户端就需要设置相同的令牌才能登陆服务器,从而进行数据校验。

日志输出


pushServer.LogNet = new HslCommunication.LogNet.LogNetSingle( "log.txt" );       // 支持日志

  

监控在线客户端数量


有一个属性是标识服务器端在线的所有客户端的数量,方便的系统进行监控

pushServer.OnlineCount

星形数据网络


上面演示的都是手动推送的服务器数据,或是写代码采集设备来实现自动推送,如果想做分布式的数据推送,或是缓解服务器的数据推送,那么可以按照如下做

就是说,由一个主服务器将数据推到2个子服务器,再由子服务器将数据推送给客户端

对于主服务和推送客户端代码不需要任何改变,主要是加一层中间服务器,也是NetPushServer类,子服务器的数据需要来自手动,只需要手动加一行代码即可

OperateResult create = pushServer.CreatePushRemote( "127.0.0.1", 12345, "A" );

                if(create.IsSuccess)
{
MessageBox.Show( "创建成功!" );
}
else
{
MessageBox.Show( "创建失败!" + create.Message );
}

意思就是这个子服务器订阅了另一个主服务器的关键字A的数据,并实时推给了其他在线的客户端。

熟悉这个原理后,就可以构建一个高性能的数据推送网络服务。

动态关键字


以上的操作都是静态的关键字推送,推送的数据都是大家都有的,如何推送一个专门的客户端呢?也可以实现,稍微复杂一点,先通过另一个网络来约定一个共同的唯一的关键字,比如GUID码,然后已这个码作为关键字推送。

另一种交互网络可以参考:http://www.cnblogs.com/dathlin/p/7697782.html

这种情况适用什么例子呢,,,,比如你向服务器弄了个请求,这个请求可能很久,你也不知道服务器什么时候能完成,需要一个百分比显示服务器进度的时候,就需要动态关键字了,服务器操作的过程只需要向唯一的关键字推送进度即可。

如果有什么问题,可以加群聊。

C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送的更多相关文章

  1. 使用Power BI API 向流数据集推送实时数据并在仪表板可视化

    使用Power BI 实现实时数据的可视化是大家比较关心的一个话题,在仪表盘上实现推送数据的展示,可以在诸如指挥大屏等场景下使用. 本视频实战内容如下: https://v.qq.com/x/page ...

  2. Kafka ETL 之后,我们将如何定义新一代实时数据集成解决方案?

    上一个十年,以 Hadoop 为代表的大数据技术发展如火如荼,各种数据平台.数据湖.数据中台等产品和解决方案层出不穷,这些方案最常用的场景包括统一汇聚企业数据,并对这些离线数据进行分析洞察,来达到辅助 ...

  3. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

  4. 实时数据推送webSocket

    实时数据推送 在Web或移动项目中,服务器向客户端实时推送消息是一种常见的业务需求. 实现方式 Polling:轮询(俗称“拉”),即定期重新请求数据. Long-Polling:长轮询,是 Poll ...

  5. swoole+Redis实现实时数据推送

    <?php /** * *************************************** * 单进程保护 * * ********************************* ...

  6. 使用ESP8266nodeMCU 向微信推送模板数据

    使用HTTPS协议向微信公众号推送消息,(使用ESP8266的低成本实现) 前几天被朋友问到这个东西的实现方式,花了一下午时间研究一下,特此记录.没有排版比较乱. 一丶前往微信公众平台注册微信微信公众 ...

  7. 实现织梦dedecms百度主动推送(实时)网页抓取

    做百度推广的时候,如何让百度快速收录呢,下面提供了三种方式,今天我们主要讲的是第一种. 如何选择链接提交方式 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保 ...

  8. Win10环境下使用Flask配合Celery异步推送实时/定时消息(Socket.io)/2020年最新攻略

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_163 首先得明确一点,和Django一样,在2020年Flask 1.1.1以后的版本都不需要所谓的三方库支持,即Flask-Ce ...

  9. Swift - JPush极光推送的使用3(根据Alias别名,给某个指定用户发推送)(转)

    一.别名(alias)介绍 (1)我们可以给每一个安装了应用程序的用户,取不同别名来标识(比如可以使用用户账号的 userid 来作为别名). (2)以后给某个特定用户推送消息时,就可以用此别名来指定 ...

随机推荐

  1. 用Java画简单验证码

    以下是具体代码: package com.jinzhi.tes2; import java.awt.Color;import java.awt.Font;import java.awt.Graphic ...

  2. Pandas 学习笔记

    Pandas 学习笔记 pandas 由两部份组成,分别是 Series 和 DataFrame. Series 可以理解为"一维数组.列表.字典" DataFrame 可以理解为 ...

  3. Golang实现杨辉三角

    杨辉三角,也算是一个经典的题目了.就简单的说说. 写代码之前,先分析要做的东西的特点,找到规律,再把这个规律描述一下. 然后把这个描述翻译成编程语言,就可以说是编程了. 那么杨辉三角有什么特点? 首先 ...

  4. 【python游戏编程04--加载位图与常用的数学函数】

    一.pygame中常用的数学函数 首先介绍两个角度和弧度转换的函数 math.degress()和math.radians()用法很简单,只要将数值传进去然后接受返回值就可以 math.cos(ang ...

  5. eclipse Oxygen2 4.7.2版本安装activiti插件,并兼容svn插件

    附录,插件下载:链接:https://pan.baidu.com/s/138ChoXao1fALBzdOhJjdQg 密码:06fx 安装方法: 解压eclipse安装包,将eclipse-activ ...

  6. bzoj千题计划168:bzoj3513: [MUTC2013]idiots

    http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i ...

  7. python基础知识点三

    内置函数和匿名函数 python 一共有68个内置的函数:它们就是python提供给你直接可以拿来使用的所有函数 内置函数的图:链接 :https://www.processon.com/mindma ...

  8. 【SQL Server 问题记录】A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.

    本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 A network-related or instance-specific error occurred while esta ...

  9. linux解压类型总结

    1.*.tar 用 tar –xvf 解压2.*.gz 用 gzip -d或者gunzip 解压3.*.tar.gz和*.tgz 用 tar –xzf 解压4.*.bz2 用 bzip2 -d或者用b ...

  10. bootStrap table 和 JS 开发过程中遇到问题汇总

    1..bootStrap-table表头固定 在table定义的时候给高度属性就可以自动生成滚动条,并且固定表头[height: 220,] 2.为动态生成的DOM元素绑定事件 on("cl ...