remoting技術的通訊建立分為兩種:伺服器端啟用和客戶端啟用。本次設計採用的是伺服器端啟用模式。
在通道的建立過程中,需要在伺服器端和客戶端分別進行處理。
伺服器端處理如下:
要跨越應用程式域進行通訊,必須實現通道。如前所述,remoting
提供了ichannel
介面,分別包含
tcpchannel
和httpchannel
兩種型別的通道。這兩種型別除了效能和序列化資料的格式不同外,實現的方式完全一致,因此下面我們就以
tcpchannel
為例。
註冊tcpchannel
,首先要在專案中新增引用
「system.runtime.remoting」
,然後using
名字空間:
system.runtime.remoting.channel.tcp。
**如下:
static void main(string args)
在例項化通道物件時,將埠號作為引數傳遞。然後再呼叫靜態方法registerchannel()
來註冊該通道物件即可。
註冊了通道後,要能啟用遠端物件,必須在通道中註冊該物件。根據啟用模式的不同,註冊物件的方法也不同。
(1)singleton模式
對於wellknown
物件,可以通過靜態方法
remotingconfiguration.registerwellknownservicetype()
來實現:
remotingconfiguration.registerwellknownservicetype
(typeof(serverremoteobject.serverobject),"servicemessage",wellknownobjectmode.singleton);
(2)singlecall模式
註冊物件的方法基本上和singleton
模式相同,只需要將列舉引數
wellknownobjectmode
改為singlecall
就可以了。
remotingconfiguration.registerwellknownservicetype
(typeof(serverremoteobject.serverobject),"servicemessage",wellknownobjectmode.singlecall);
客戶端主要做兩件事,一是註冊通道。remoting
中伺服器端和客戶端都必須通過通道來傳遞訊息,以獲得遠端物件。第二步則是獲得該遠端物件。
註冊通道:
//初始化全域性變數
tcpclientchannel chan;
//分伺服器宣告
ihotelremoteservice hotelremoteservice;
icarremoteservice carremoteservice;
iflightremoteservice flightremoteservice;
icustomerremoteservice customerremoteservice;
ireservationremoteservice reservationremoteservice;
chan = new tcpclientchannel();
channelservices.registerchannel(chan, false);
#region 例項化遠端物件
hotelremoteservice = (ihotelremoteservice)activator.getobject
(typeof(ihotelremoteservice), "tcp://localhost:9998/service", null);
carremoteservice = (icarremoteservice)activator.getobject
(typeof(icarremoteservice), "tcp://localhost:9999/service", null);
customerremoteservice = (icustomerremoteservice)activator.getobject
(typeof(icustomerremoteservice), "tcp://localhost:9997/service", null);
flightremoteservice = (iflightremoteservice)activator.getobject
(typeof(iflightremoteservice), "tcp://localhost:9996/service", null);
reservationremoteservice = (ireservationremoteservice)activator.getobject
(typeof(ireservationremoteservice), "tcp://localhost:9995/service", null);
#endregion
注意在客戶端例項化通道時,是呼叫的預設建構函式,即沒有傳遞埠號。事實上,這個埠號是缺一不可的,只不過它的指定被放在後面作為了uri
的一部分。
獲得遠端物件。
與伺服器端相同,不同的啟用模式決定了客戶端的實現方式也將不同。不過這個區別僅僅是wellknown
啟用模式和客戶端啟用模式之間的區別,而對於
singleton
和singlecall
模式,客戶端的實現完全相同。
wellknown啟用模式
要獲得伺服器端的知名遠端物件,可通過activator
程序的getobject()
方法來獲得:
serverremoteobject.serverobject serverobj = (serverremoteobject.serverobject)
activator.getobject(
typeof
(serverremoteobject.serverobject), "tcp://localhost:8080/servicemessage");
首先以wellknown
模式啟用,客戶端獲得物件的方法是使用
getobject
()。其中引數第乙個是遠端物件的型別。第二個引數就是伺服器端的
uri。如果是
通道,自然是用了。因為我是用本地機,所以這裡是
localhost
,你可以用具體的伺服器
ip位址來代替它。埠必須和伺服器端的埠一致。後面則是伺服器定義的遠端物件服務名,即
屬性的內容。
分布式資料庫系統 商旅預定系統的實現(1)
今天看到師弟他們又像我們去年一樣忙著老闆的課程結課設計,想著我是去年如何苦逼的過程,想把我的開發經歷分享出來。專案介紹 本系統是在學習了分布式資料庫課程的基礎上設計的。在microsoft visual studio 2010開發平台上用c 語言組建了乙個分布式應用系統,實現了乙個簡單的分布式旅行預...
分布式資料庫系統 商旅預定系統的實現(10)
事務有了統一的規範和編碼,下一步就需要考慮具體該怎樣儲存乙個事務了。首先,乙個操作有它的唯一編碼,通過string型別來儲存id編碼值。其次需要儲存的就是引數列表,因為每乙個操作所需要的引數時不同的,所以考慮用list是首選方案。具體 實現 儲存一次操作過程的所有方法編號和方法的引數列表 seria...
分布式資料庫系統
隨著傳統的資料庫 計算機網路和數字通訊技術的飛速發展,以資料分布儲存和分布處理為主要特徵的分布式資料庫系統的研究和開發越來越受到人們的關注。但由於其開發較為複雜,在一定程度上制約了它的發展。基於此,本文提出了在.net環境下使用一種新的開發語言c 結合ado.net資料訪問模型來開發分布式資料庫系統...