C# 資料推送 即時資料推送 輕量級訊息訂閱發布 多級訊息推送 分布式推送

來源:互聯網
上載者:User

標籤: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# 資料推送 即時資料推送 輕量級訊息訂閱發布 多級訊息推送 分布式推送

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.