C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送
2021-04-12 23:25
标签:from 功能 create 通过 登陆 mat 下载 方法 基本 本文将使用一个NuGet公开的组件技术来实现数据订阅推送功能,由服务器进行推送数据,客户端订阅指定的数据后,即可以接收服务器推送过来的数据,包含了自动重连功能,使用非常方便 nuget地址:https://www.nuget.org/packages/HslCommunication/ github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持。 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装: NuGet安装教程 http://www.cnblogs.com/dathlin/p/7705014.html 技术支持QQ群:592132877 (组件的版本更新细节也将第一时间在群里发布)组件API地址:http://www.cnblogs.com/dathlin/p/7703805.html 下面的一个项目是这个组件的访问测试项目,您可以进行初步的访问的测试,免去了您写测试程序的麻烦,源代码也在本文开始处的项目里, 下载地址为:HslCommunicationDemo.zip 以下就是对服务器的指定关键字的数据的订阅,服务器提供了几个关键字订阅,以供测试。 如果该服务器不可用,请下载本地版本的服务器 PushNetServer.zip ModBus组件所有的功能类都在 HslCommunication.Enthernet 命名空间,所以再使用之前先添加 先进行声明变量 然后再一个启动按钮里写上如下的代码 到这里为止,服务器的代码基本已经写好了,短短的两三行代码而已。只是目前的数据并没有数据推送功能。 一个经典的情景是什么,比如你有一堆实时数据是从设备采集回来的,这些数据是在服务器上的。 你还有个客户端的软件,很多人同时在线,如果别人打开监控实时数据的话,就特别适用于本组件的方法,因为你走数据库显然是更慢的,而且对服务器压力也大。采用本组件就可以完美的解决这件事情、 假设你采集了来自设备的数据,我们做个1秒钟的定时器,然后启动定时器,模拟每秒钟的数据推送,推送什么呢?先试试看随机数 定时器的代码如下: 到这里为止,服务器的一个完整的代码已经写完了。我们来看看客户端怎么写 先进行声明变量 实例化,需要指定服务器的IP和端口,还有想订阅的关键字 接下来就是创建订阅了,需要指定一个调用的委托,会返回一个是否成功的信号,因为有可能网络的原因,有可能因为没有这个关键字,会导致创建失败。 上面使用了一个委托,PushFromServer的方法如下,主要是使用委托把数据显示出来: 在相应的窗口关闭之前,关闭掉客户端就可以了。如果不手动关闭,当你关闭窗口的时候,该连接很有可能仍然存在。 一个简单的完整的数据订阅功能已经完成了。 上面的代码只能推送字符串数据,怎么样实现推送复杂的数据呢,我们假设有4个数据,需要同时推送给客户端。那我们可以选择2种方式,一种是json,一种是xml,各有优缺点 JSON Xml 解析的时候按照对应的信息解析即可。 服务器支持令牌设置,如果客户端无法提供一致的令牌校验,就会被拒绝连接,提升系统的安全性 客户端就需要设置相同的令牌才能登陆服务器,从而进行数据校验。 有一个属性是标识服务器端在线的所有客户端的数量,方便的系统进行监控 上面演示的都是手动推送的服务器数据,或是写代码采集设备来实现自动推送,如果想做分布式的数据推送,或是缓解服务器的数据推送,那么可以按照如下做 就是说,由一个主服务器将数据推到2个子服务器,再由子服务器将数据推送给客户端 对于主服务和推送客户端代码不需要任何改变,主要是加一层中间服务器,也是NetPushServer类,子服务器的数据需要来自手动,只需要手动加一行代码即可 意思就是这个子服务器订阅了另一个主服务器的关键字A的数据,并实时推给了其他在线的客户端。 熟悉这个原理后,就可以构建一个高性能的数据推送网络服务。 以上的操作都是静态的关键字推送,推送的数据都是大家都有的,如何推送一个专门的客户端呢?也可以实现,稍微复杂一点,先通过另一个网络来约定一个共同的唯一的关键字,比如GUID码,然后已这个码作为关键字推送。 另一种交互网络可以参考:http://www.cnblogs.com/dathlin/p/7697782.html 这种情况适用什么例子呢,,,,比如你向服务器弄了个请求,这个请求可能很久,你也不知道服务器什么时候能完成,需要一个百分比显示服务器进度的时候,就需要动态关键字了,服务器操作的过程只需要向唯一的关键字推送进度即可。 如果有什么问题,可以加群聊。 C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送 标签:from 功能 create 通过 登陆 mat 下载 方法 基本 原文地址:https://www.cnblogs.com/dathlin/p/8992315.html前言
Install-Package HslCommunication
访问测试项目,客户端和服务器的源代码都在上面的地址里
特性支持
引用
using HslCommunication.Enthernet;
using HslCommunication;
服务器端搭建
private NetPushServer pushServer;
pushServer = new NetPushServer( );
pushServer.ServerStart( 12345 );
private Random random = new Random( ); // 先定义一个随机数生成器
pushServer.PushString( "A", random.Next( 1000, 10000 ).ToString( ) );
客户端端搭建
private NetPushClient pushClient;
pushClient = new NetPushClient( "127.0.0.1", 12345, "A" );
OperateResult create = pushClient.CreatePush( new Action
private void PushFromServer( NetPushClient pushClient, string data )
{
if (IsHandleCreated) Invoke( new Action
pushClient.ClosePush( );
复杂数据订阅
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( ) );
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
星形数据网络
OperateResult create = pushServer.CreatePushRemote( "127.0.0.1", 12345, "A" );
if(create.IsSuccess)
{
MessageBox.Show( "创建成功!" );
}
else
{
MessageBox.Show( "创建失败!" + create.Message );
}
动态关键字
文章标题:C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送
文章链接:http://soscw.com/index.php/essay/74924.html