對於一些基於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埠的值。
<三.demo服務端在公升級老的demo時,首先需要新增esplatform.dll的引用,然後,使用esplatform.dll程式集中的esplatform.rapid.rapidserverengine替代esplus.rapid.rapidserverengine,並在建構函式中指定:當前服務端例項的id、acms的ip位址及其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完全一致。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而言,客戶端的修改非常小,只是將配置檔案中的伺服器的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資訊被寫在客戶端,然後經瀏覽器再次提交到伺服器,即使兩次...