1、.NET Remoting概念 1、一種分散式處理方式。從字面意義上看出,他是基於.net平臺的一種遠程對象開發技術,該技術是將遠程電腦中的數據視為分散式對象來進行開發。 2、一種網路通信技術。既然這種技術可以操作遠程電腦的數據,他當然是網路通信技術。 2、.NET Remoting使用的技 ...
1、.NET Remoting概念 1、一種分散式處理方式。從字面意義上看出,他是基於.net平臺的一種遠程對象開發技術,該技術是將遠程電腦中的數據視為分散式對象來進行開發。 2、一種網路通信技術。既然這種技術可以操作遠程電腦的數據,他當然是網路通信技術。 2、.NET Remoting使用的技術 1、Xml 2、SOAP SOAP=簡單對象傳輸協議。 3、序列化 -二進位 -xml 3、.NET Remoting原理 通過通道(Channel)實現網路之間通信的。 1、首先通過Remoting訪問通道以獲得服務端訪問對象 2、再通過代理解析為客戶端對象 3、然後就可以在客戶端去操作這個服務端對象了 客戶端要獲取伺服器端對象,我們只需要知道通道的類型(TcpChannel和HttpChannel)和伺服器端的埠號就可以了,無需知道數據包的格式。 要註意的是,客戶端在獲取服務端對象時,並不是獲取服務端實際的對象,而是獲取了他的引用,這既保證了客戶端和伺服器端的有關對象的鬆散耦合,同時也優化了通信的性能。 4、.NET Remoting中的主要元素 4.1 遠程對象 遠程對象是.net remoting的核心元素,他分為兩種 1、操作遠程對象 2、傳遞遠程對象 操作遠程對象,就是對象運行在遠程,客戶端通過引用來發送操作消息。這種遠程對象必須是MarshlByRefObject這個類的派生類, 這樣才能將他的對象引用傳遞到客戶端。 傳遞遠程對象是指將遠程對象複製到本地,客戶端對其操作,然後把操作後的副本發送回伺服器端,此類的操作對象必須標記為[Serializable] 4.2 通道(Channels) 分為 TcpChannel 和HttpChannel。 TcpChannel使用二進位格式序列化消息對象,因此他具有更高的傳輸性能。 HttpChannel使用SOAP格式序列化消息對象,因此他具有更好的互操作性。 4.3 激活方式 什麼是激活方式?我們在操作遠程對象時需要考慮一個問題:遠程對象何時創建,由誰來創建,這些都取決於激活方式。 激活方式分為兩種:伺服器激活和客戶端激活。 主要是學習伺服器激活方式。 Singleton SingleCall 5、.NET Remoting的開發步驟
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.Remoting.Channels.Http;
5.1 步驟1:創建遠程對象類 遠程對象類必須派生自System.MarshlByRefObject。
/* * 遠程對象類必須派生自MarshalByRefObject */ public class RemoteClass : MarshalByRefObject { int num = 0; public RemoteClass() { Console.WriteLine("激活了RemoteClass遠程對象"); } public string Method(string name) { Console.WriteLine("第{0}次調用,參數為{1}", num++, name); return "hello " + name; } }
5.2 步驟2:創建服務端宿主程式,用於接收客戶端請求 1、註冊管道 2、註冊伺服器激活對象方式
/* * 需要引用System.Runtime.Remoting */ class Program { static void Main(string[] args) { //1、註冊管道 TcpChannel tcpChannel = new TcpChannel(10000);//埠指定 HttpChannel httpChannel = new HttpChannel(10001); ChannelServices.RegisterChannel(tcpChannel, true); ChannelServices.RegisterChannel(httpChannel, false); //2、註冊伺服器激活方式 //WellKnownObjectMode.Singleton表示生成的實例是單例模式 //WellKnownObjectMode.SingleCall表示每個傳入消息是由新的對象實例 RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteClass), "HelloTest", WellKnownObjectMode.SingleCall); Console.WriteLine("這裡是伺服器端宿主程式"); Console.Read(); } }
5.3 步驟3:創建客戶端,調用遠程對象 1、註冊通道 2、根據URL獲取對象代理 3、使用代理調用遠程對象
class Program { static void Main(string[] args) { #region TCP方式 /* //1、註冊通道 TcpChannel tcpChannel = new TcpChannel();//客戶端不需要指定埠號 ChannelServices.RegisterChannel(tcpChannel, true); //2、創建代理 RemoteClass rc = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "tcp://localhost:10000/HelloTest");//1000埠號是伺服器端指定的 if (rc == null) { Console.WriteLine("Could not locate TCP Server"); } Console.WriteLine("TCP方式{0}", rc.Method("張飛")); //*/ #endregion #region Http方式 HttpChannel httpChannel = new HttpChannel(); ChannelServices.RegisterChannel(httpChannel, false); RemoteClass object2 = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "http://localhost:10001/HelloTest"); if (object2 == null) { Console.WriteLine("Could not locate HTTP Server"); } Console.WriteLine("HTTP方式{0}", object2.Method("關羽")); #endregion Console.Read(); } }
5.4 調試 1、設置Server為啟動項目 2、f5啟動服務端 4、啟動client 效果: 6、.NET Remoting的配置文件 不用代碼註冊,用配置文件 服務端: RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, true); 客戶端: RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, true); RemoteClass obj = new RemoteClass(); Console.WriteLine("HTTP方式{0}", obj.Method("祥子")); 代碼下載