伺服器群集 跨伺服器通訊Demo(原始碼)

2021-06-18 19:13:45 字數 3609 閱讀 4266

對於一些基於tcp socket的大型c/s應用來說,能進行跨伺服器通訊可能是乙個繞不開的功能性需求。出現這種需求的場景類似於下面描述的這種情況。

如何解決了?這就需要引入群集平台的概念。群集平台中有乙個應用群集管理伺服器acms可以將所有的tcp應用伺服器管理起來,並且能在它們之間**訊息。這樣,即使位於不同的tcp應用伺服器上的客戶端之間也可以相互傳送訊息了。結構模型簡化後如下所示:

以上圖為例,兩個客戶端client01與client02分別連上不同的應用伺服器as01和as02,我們假設由於路由器的原因(比如兩個路由器的nat型別都是symmetric),client01與client02之間的p2p通道沒有建立成功。此時,如果client01與client02之間要相互溝通資訊,那麼資訊就會經過acms中轉。比如client01要發資訊給client02,資訊經過的路線將會是:client01 => as01 => acms => as02 => client02。

能簡單地實現這種模型嗎?並且讓這種跨伺服器通訊對於客戶端而言是透明的?當然,基於esplatform群集平台,我們很容易做到這一點。 本文我們就實現乙個這樣的demo。我們之前有個老的簡單的im的demo,它演示了客戶端與伺服器、以及客戶端與客戶端之間的基本通訊功能。只不過,在那個demo中,相互通訊的客戶端連上的是同乙個服務端。本文的demo就是在那個老demo的基礎上來進行公升級,使得位於不同伺服器上的兩個客戶端之間也可以相互通訊。

一.demo專案結構

本demo總共包含4個專案。

1.esplatform.acmserver:這個是基於esplatform的應用群集伺服器acms。

2.esplatform.******demo.core:用於定義公共的資訊型別、通訊協議。

3.esplatform.******demo.server:demo的服務端。

4.esplatform.******demo.client:demo的客戶端。

二.應用群集管理伺服器acms

我們不需要對acms進行任何修改,只需要關注配置檔案中transferport和remoting埠的值。

<

configuration

>

<

>

<

add

key="serverassignedpolicy"

value

="minusercount"

/>

<

add

key="transferport"

value

="12000"

/>

>

<

system.runtime.remoting

>

<

>

<

channels

>

<

channel

ref="tcp"

port

="11000"

>

<

serverproviders

>

<

provider

ref="wsdl"

/>

<

formatter

ref="soap"

typefilterlevel

="full"

/>

<

formatter

ref="binary"

typefilterlevel

="full"

/>

serverproviders

>

<

clientproviders

>

<

formatter

ref="binary"

/>

clientproviders

>

channel

>

channels

>

>

system.runtime.remoting

>

configuration

>

三.demo服務端在公升級老的demo時,首先需要新增esplatform.dll的引用,然後,使用esplatform.dll程式集中的esplatform.rapid.rapidserverengine替代esplus.rapid.rapidserverengine,並在建構函式中指定:當前服務端例項的id、acms的ip位址及其transferport和remoting埠。

//

esplatform.server.defaultfriendsmanager friendmanager = new esplatform.server.defaultfriendsmanager();

this.engine = new

esplatform.rapid.rapidserverengine(int.parse(this.textbox_serverid.text), this.textbox_acmsip.text, int.parse(this.textbox_acmsport.text) ,int.parse(this.textbox_transferport.text));

this.engine.friendsmanager = friendmanager;

this.engine.initialize(int.parse(this.textbox_serverport.text), new customizehandler(), new basichandler());

friendmanager.platformusermanager = this.engine.platformusermanager;

其它的部分與老demo完全一致。

四.demo客戶端

相對於老的demo而言,客戶端的修改非常小,只是將配置檔案中的伺服器的ip和埠移到了登入介面上,這樣方便指定要連線的服務端的位址。除此之外,沒有其它變化,甚至,客戶端的專案都不需要引用esplatform.dll。

五.執行demo

1.啟動應用群集管理伺服器acms。

2.啟動第乙個服務端,serverid指定為0,監聽6000埠。

3.啟動第二個服務端,serverid指定為1,監聽6001埠。

4.啟動第乙個客戶端,連線serverid為0的服務端。

5.啟動第二個客戶端,連線serverid為1的服務端。

6.兩個客戶端之間可以相互對話了。

(在正式的應用場景中,acms、兩個服務端、兩個客戶端 可以部署在不同的機器器上)

下圖是demo執行起來的效果:

群集、跨伺服器通訊demo原始碼

跨伺服器查詢

select from openrowset msdasql driver server 0.uid pwd kft.dbo.user 建立乙個鏈結的伺服器 引數 1被訪問的伺服器別名 4要訪問的伺服器 exec sp addlinkedserver l ms sqloledb 0.gogo 登陸l...

跨伺服器連線

跨伺服器連線 sql語句 要替換的名稱 public static system.data.datatable sqllink string sql,string serverprefix catch exception ex return dt 例 sql 語句 select number two...

伺服器實現 如何實現session跨伺服器共享

session共享有多種解決方法,常用的有四種 客戶端cookie儲存 伺服器間session同步 使用集群管理session 把session持久化到資料庫。1.客戶端cookie儲存 以cookie加密的方式儲存在客戶端,每次session資訊被寫在客戶端,然後經瀏覽器再次提交到伺服器,即使兩次...