C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送

前言



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

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

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

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

Install-Package HslCommunication

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

技术支持QQ群:592132877  (组件的版本更新细节也将第一时间在群里发布)组件API地址:http://www.cnblogs.com/dathlin/p/7703805.html

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



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

下载地址为:HslCommunicationDemo.zip

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

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

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

PushNetServer.zip

特性支持


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

引用



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

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

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

原文地址:https://www.cnblogs.com/dathlin/p/8992315.html

时间: 2024-11-02 14:20:32

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

澜讯 | 大数据赋能金融,宁波银行携数澜打造实时数据平台

近日,宁波银行签约数澜科技,双方将共同打造「实时数据平台」,通过引入实时计算来加工.处理和分析数据,从而高效的挖掘到数据价值. 宁波银行成立于 1997 年,2007 年成为国内首家在深圳证券交易所挂牌上市的城市商业银行(股票代码:002142).目前拥有 12 家分行,327 家营业网点,已经发展成为一家资本净额超 930 亿元,总资产超 10000 亿元,员工人数超 1.5 万人的区域性股份制上市银行,跻身全球前 200 家银行之列. 随着银行业务往线上.移动化集中,诸如反欺诈.事件式客户营

大数据理论体系总结--数据仓库管理与全链路数据体系

前言 就这样,大数据领域蓬勃发展了好几年,有很多伙伴执迷于技术,成为了分布式计算与存储的领域专家.也有很多伙伴执迷于数据,成为了行业的数据研发专家.当然还有很多小伙伴,热衷于工具系统开发,成为了数据技术专家.那么我们回过头来考虑,什么是大数据,什么又是数据仓库,什么又是数据技术.大数据其实是个非常笼统的感念,它是由数据仓库演化而来的数据与技术方法论,那么我们先说一下数据仓库的由来: 早在多年以前在Hadoop.Spark.Storm.Kafka等系列分布式计算与存储.消息中间件还没有成熟的时候,

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

本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何去推送复杂的数据,以及推送一个实时的图表数据,文本为我原创,转载请注明出处:Richard.Hu,先上一堆乱七八糟的说明先: SignalR的官方地址是: https://www.asp.net/signalr 网上给出例子是一个聊天的例子,官网地址是:https://docs.microsoft.

关于云开发新服务“实时数据推送”,你需要了解的全在这了!

"微信小程序工程师邓坤力带你了解如何利用千呼万唤始出来的云开发实时数据推送服务打造生动的小程序和小游戏!" 在数据库在小程序·云开发中的应用一文中,我们了解到实时数据推送作为云开发即将上线的一项新能力,主要指客户端使用官方SDK发起socket连接建立对一个集合的监听,目标集合中如果有符合过滤条件的数据发生变更,将会直接推送到建立监听的客户端. 简单来说,使用实时数据推送可以更有效率的拉取数据,帮你把你的应用变成实时有状态,场景会非常有用,比如可以用来做弹幕,做实时排名更新,做实时刷新

swoole+Redis实现实时数据推送

<?php /** * *************************************** * 单进程保护 * * *************************************** */ $phpSelf = realpath($_SERVER['PHP_SELF']); $lockFile = $phpSelf.'.lock'; $lockFileHandle = fopen($lockFile, "w"); if ($lockFileHandle =

live555 播放视频 play 不能推送rtp数据

在项目开发过程中遇到一个问题,play之后,不能推送rtp数据包,跟踪代码调试发现,在获取H264视频数据,封包,发送,这条循环的链断开了,导致该问题的原因是: 在H264VideoStreamFramer.cpp中 unsigned H264VideoStreamParser::parse() { #if DEBUG_SHOWCHN printf("Parser() chn:%d\n", fchn); #endif try{ // The stream must start with

rsync+inotify实时数据同步单目录实战

rsync+inotify实时数据同步单目录实战 inotify是一个强大的.细粒度的.异步的文件系统事件监控机制,linux内核从2.6.13起加入了inotify支持,通过inotify可以监控文件系统中添加.删除.修改.移动等各种事件,利用这个内核接口,第三方软件可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件. inotify配置是建立在rsync服务基础上的配置过程 操作系统 主机名 网卡eth0 默认网关 用途 [email protected]

基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)

今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 Demo.接下来我们就看看这个实时数据通讯是一个什么样的套路. 我们先来聊聊这次 Demo 的思路吧,首先我要有一个 3D 的拓扑图组件,在上面创建几个节点,然后通过拉力布局(ForceLayout)将这些节点自动布局,但是有一定,需要在不同的网页窗口下,对应节点的位置是一样的,简单地说就是不同网页窗口

Rsync+Sersync实时数据同步

sersync实时数据同步 Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别? 1.Rsync+Inotify-tools (1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加.删除.修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来: (2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此