文章目錄
通訊通道的建立過程1.註冊通道
Remoting技術的通訊建立分為兩種:伺服器端啟用和用戶端啟用。本次設計採用的是伺服器端啟用模式。
在通道的建立過程中,需要在伺服器端和用戶端分別進行處理。
伺服器端處理如下:
要跨越應用程式定義域進行通訊,必須實現通道。如前所述,Remoting提供了IChannel介面,分別包含TcpChannel和HttpChannel兩種類型的通道。這兩種類型除了效能和序列化資料的格式不同外,實現的方式完全一致,因此下面我們就以TcpChannel為例。
註冊TcpChannel,首先要在項目中添加引用“System.Runtime.Remoting”,然後using名字空間:System.Runtime.Remoting.Channel.Tcp。
代碼如下:
static void Main(string[] args) { #region 資料表一(Car)的伺服器啟動 TcpServerChannel chanCar = new TcpServerChannel(9999); ChannelServices.RegisterChannel(chanCar, false); Console.WriteLine(chanCar.ChannelName); RemotingConfiguration.RegisterWellKnownServiceType (typeof(CarRemoteServiceImpl), "Service", WellKnownObjectMode.Singleton); Console.WriteLine("資料表一(Car)的伺服器啟動..."); #endregion Console.WriteLine("Press <Enter> to Exit..."); Console.ReadLine(); }
在執行個體化通道對象時,將連接埠號碼作為參數傳遞。然後再調用靜態方法RegisterChannel()來註冊該通道對象即可。
2.註冊遠程對象
註冊了通道後,要能啟用遠程對象,必須在通道中註冊該對象。根據啟用模式的不同,註冊對象的方法也不同。
(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);
3.用戶端處理
用戶端主要做兩件事,一是註冊通道。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。如果是http通道,自然是用了。因為我是用本地機,所以這裡是localhost,你可以用具體的伺服器IP地址來代替它。連接埠必須和伺服器端的連接埠一致。後面則是伺服器定義的遠程物件服務名,即ApplicationName屬性的內容。