Remoting實驗,基礎部分和接口事件

一、Remoting基礎

如圖所示:

首先,客戶端通過Remoting,訪問通道以獲得服務端對象,再通過代理解析爲客戶端對象。這就提供一種可能性,即以服務的方式來發布服務器對象。遠程對象代碼可以運行在服務器上(如服務器激活的對象和客戶端激活的對象),然後客戶端再通過Remoting連接服務器,獲得該服務對象並通過序列化在客戶端運行。

在Remoting中,對於要傳遞的對象,設計者除了需要了解通道的類型和端口號之外,無需再瞭解數據包的格式。但必須注意的是,客戶端在獲取服務器端對象時,並不是獲得實際的服務端對象,而是獲得它的引用。這既保證了客戶端和服務器端有關對象的鬆散耦合,同時也優化了通信的性能。

1、Remoting的通道

Remoting的通道主要有:Tcp,Http和Ipc。在.Net中,System.Runtime.Remoting.Channel中定義了IChannel接口。IChannel接口包括了上述三種通道類型。

TcpChannel類型放在名字空間System.Runtime.Remoting.Channel.Tcp中。

Tcp通道提供了基於Socket的傳輸工具,使用Tcp協議來跨越Remoting邊界傳輸序列化的消息流。TcpChannel類型默認使用二進制格式序列化消息對象,因此它具有更高的傳輸性能。

HttpChannel類型放在名字空間System.Runtime.Remoting.Channel.Http中。

它提供了一種使用Http協議,使其能在Internet上穿越防火牆傳輸序列化消息流。默認情況下,HttpChannel類型使用Soap格式序列化消息對象,因此它具有更好的互操作性。

通常在局域網內,我們更多地使用TcpChannel;如果要穿越防火牆,則使用HttpChannel。

2、遠程對象的激活方式

在訪問遠程類型的一個對象實例之前,必須通過一個名爲Activation的進程創建它並進行初始化。這種客戶端通過通道來創建遠程對象,稱爲對象的激活。在Remoting中,遠程對象的激活分爲兩大類:服務器端激活和客戶端激活。

(1) 服務器端激活,又叫做WellKnow方式,很多又翻譯爲知名對象。爲什麼稱爲知名對象激活模式呢?是因爲服務器應用程序在激活對象實例之前會在一個衆所周知的統一資源標識符(URI)上來發布這個類型。然後該服務器進程會爲此類型配置一個WellKnown對象,並根據指定的端口或地址來發布對象。.Net Remoting把服務器端激活又分爲SingleTon模式和SingleCall模式兩種。

SingleTon模式:此爲有狀態模式。如果設置爲SingleTon激活方式,則Remoting將爲所有客戶端建立同一個對象實例。當對象處於活動狀態時,SingleTon實例會處理所有後來的客戶端訪問請求,而不管它們是同一個客戶端,還是其他客戶端。SingleTon實例將在方法調用中一直維持其狀態。舉例來說,如果一個遠程對象有一個累加方法(i=0;++i),被多個客戶端(例如兩個)調用。如果設置爲SingleTon方式,則第一個客戶獲得值爲1,第二個客戶獲得值爲2,因爲他們獲得的對象實例是相同的。如果熟悉Asp.Net的狀態管理,我們可以認爲它是一種Application狀態。

SingleCall模式:SingleCall是一種無狀態模式。一旦設置爲SingleCall模式,則當客戶端調用遠程對象的方法時,Remoting會爲每一個客戶端建立一個遠程對象實例,至於對象實例的銷燬則是由GC自動管理的。同上一個例子而言,則訪問遠程對象的兩個客戶獲得的都是1。我們仍然可以借鑑Asp.Net的狀態管理,認爲它是一種Session狀態。

(2) 客戶端激活。與WellKnown模式不同,Remoting在激活每個對象實例的時候,會給每個客戶端激活的類型指派一個URI。客戶端激活模式一旦獲得客戶端的請求,將爲每一個客戶端都建立一個實例引用。SingleCall模式和客戶端激活模式是有區別的:首先,對象實例創建的時間不一樣。客戶端激活方式是客戶一旦發出調用的請求,就實例化;而SingleCall則是要等到調用對象方法時再創建。其次,SingleCall模式激活的對象是無狀態的,對象生命期的管理是由GC管理的,而客戶端激活的對象則有狀態,其生命週期可自定義。其三,兩種激活模式在服務器端和客戶端實現的方法不一樣。尤其是在客戶端,SingleCall模式是由GetObject()來激活,它調用對象默認的構造函數。而客戶端激活模式,則通過CreateInstance()來激活,它可以傳遞參數,所以可以調用自定義的構造函數來創建實例。

二、遠程對象的定義

前面講到,客戶端在獲取服務器端對象時,並不是獲得實際的服務端對象,而是獲得它的引用。因此在Remoting中,對於遠程對象有一些必須的定義規範要遵循。

由於Remoting傳遞的對象是以引用的方式,因此所傳遞的遠程對象類必須繼承MarshalByRefObject。MSDN對MarshalByRefObject的說明是:MarshalByRefObject 是那些通過使用代理交換消息來跨越應用程序域邊界進行通信的對象的基類。不是從 MarshalByRefObject 繼承的對象會以隱式方式按值封送。當遠程應用程序引用一個按值封送的對象時,將跨越遠程處理邊界傳遞該對象的副本。因爲您希望使用代理方法而不是副本方法進行通信,因此需要繼承MarshallByRefObject。

 

基礎大概瞭解了一下,下面直接看代碼!

實例中有很多的學習點,基本我都註釋清楚了。

 

發佈了40 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章