基礎知識: 在Remoting中是通過通道(channel)來實現兩個應用程式定義域之間通訊的
Remoting的通道有兩種:TCP和HTTP,TCP通道提供了基於Socket的傳輸工具,使用Tcp協議來跨越Remoting邊界傳輸序列化的訊息流程,TcpChannel使用二進位格式序列化訊息對象。HttpChannel使用Soap格式來序列化訊息對象,HttpChannel用Http協議使訊息能在Internet上穿越防火牆傳輸序列化的訊息流程。 遠程對象的啟用方式:伺服器端啟用和用戶端啟用
伺服器端啟用又叫WellKnow,知名對象啟用方式。
Remoting把伺服器端啟用又分為SingleTon模式和SingleCall模式兩種
SingleTon模式:有狀態模式,Remoting將為所有用戶端建立同一個對象執行個體。
SingleCall模式:當用戶端調用遠程對象的方法使,Remoting為每一個用戶端建立一個遠程對象執行個體
用戶端啟用
Remoting在啟用每一個對象的執行個體時,會給每個用戶端啟用的類型指派一個URI,來擷取通道中的遠程對象
在Remoting分布式程式中,通常包括三部分,遠程對象、服務端、用戶端,由於Remoting傳輸對象是序列化的引用方式,所以遠程對象類必須要繼承MarshalByRefObject類。
發起者和訂閱者:訊息由發起者發送,訂閱者收到該訊息後,激發事件。
2.程式結構與說明
1).總體思路用戶端啟用遠程對象,然後用此遠程對象訂閱遠程類的事件,當伺服器調用遠程類的方法發送訊息後,用戶端啟用事件接收訊息。
2)Common程式集該程式集屬於公用的,定義了委託BroadCastEventHandler和介面IBroadCast。既要在伺服器端部署,也要在用戶端部署。用戶端用GetObject()方法來啟用遠程對象,用戶端獲得IBradCast介面類型的遠程對象代理
3)類EventWrapper 此類的實現方式完全和遠程類的實現方式一樣。在用戶端註冊事件後,用此類的委託來訂閱遠程事件,並激發此事件來接收訊息
4)遠程類BroadCastObj 為了序列化傳輸對象,此類繼承了類MarshalByRefObject和實現了介面IBroadCast 通過實現委託來定義事件,發送訊息。 考慮到伺服器在發送訊息時,對用戶端發生的意外情況渾然不知,所以在發送訊息的方法中使用了委託鏈,在委託鏈的遍曆中來捕獲異常。當某一用戶端的委託發生異常時,在伺服器端給出提示資訊,並取消該委託,然後繼續遍曆其他用戶端的委託。這樣即能處理用戶端的異常,又能保證其他正常的用戶端的訊息接收。
5)Server程式集 當伺服器啟動時,建立Tcp通道,指定通道所用的協議,連接埠號碼和傳輸方式,並註冊這個通道。建立遠程對象的執行個體,並把此執行個體Marshal到通道中,並指明此對象在通道中的名稱。然後調用註冊的遠程對象的方法來發送訊息。在遠程類的方法中,用公用類EventWrapper的事件來發送訊息,而此事件也在客訂閱了,所以伺服器端發送的訊息用戶端能接收到。
6)Client程式集 建立和伺服器端類型相同的通道, 用GetObject方法啟用遠程對象的代理對象,指定遠程物件類型,使用的傳輸協議,伺服器名稱或IP,伺服器的連接埠,及遠程對象在通道中的名稱。 watch = (IBroadCast)Activator.GetObject( typeof(IBroadCast), "tcp://chenhongming:6791/CallbackSample"); 建立遠程類中事件的執行個體,並且用此執行個體訂閱本地方法 然後用遠程對象來訂閱遠程事件,此事件觸發已訂閱了本地方法的事件,程式碼範例:
本地方法:是把所接收到的訊息顯示在文字框中。由於調用本地方法不是主線程調用的,所以又要建立一個委託,通過這個委託註冊本地方法,然後在主線程中調用委託來接收訊息並顯示出來。