標籤:from 功能 create 通過 登陸 mat 下載 方法 基本
前言
本文將使用一個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
這種情況適用什麼例子呢,,,,比如你向伺服器弄了個請求,這個請求可能很久,你也不知道伺服器什麼時候能完成,需要一個百分比顯示伺服器進度的時候,就需要動態關鍵字了,伺服器操作的過程只需要向唯一的關鍵字推送進度即可。
如果有什麼問題,可以加群聊。
C# 資料推送 即時資料推送 輕量級訊息訂閱發布 多級訊息推送 分布式推送