自接觸編程以來,一直聽過這個名詞Remoting,但是對他了解少之又少,近日有點時間,參考研究研究。
其相關概念本章不做詳解,具體大家可以看下 http://baike.baidu.com/view/742675.htm?fr=aladdin ,寫的很詳細。
概念:一種分布式處理方式。從微軟的產品角度來看,可以說Remoting就是DCOM (分布式組件對象模式)的一種升級,它改善了很多功能,並極好的融合到.Net平台下。
好處:
1.提供了一種允許對象通過應用程序域與另一對象進行交互的框架。
在Windows操作系統中,是將應用程序分離為單獨的進程。這個進程形成了應用程序代碼和數據周圍的一道邊界。如果不采用進程間通信(RPC)機制,則在一個進程中執行的代碼就不能訪問另一進程。這是一種操作系統對應用程序的保護機制。然而在某些情況下,我們需要跨過應用程序域,與另外的應用程序域進行通信,即穿越邊界。
2.可以服務的方式來發布服務器對象:
代碼可以運行在服務器上(如服務器激活的對象和客戶端激活的對象),然後客戶端再通過Remoting連接服務器,獲得該服務對象並通過序列化在客戶端運行。
3.客戶端和服務器端有關對象的松散耦合
在Remoting中,對於要傳遞的對象,設計者除了需要了解通道的類型和端口號之外,無需再了解數據包的格式。這既保證了客戶端和服務器端有關對象的松散耦合,同時也優化了通信的性能。
TcpChannel:Tcp通道提供了基於Socket 的傳輸工具,使用Tcp協議來跨越Remoting邊界傳輸序列化的消息流。默認使用二進制格式序列化消息對象,具有更高的傳輸性能。適用局域網。
HttpChannel:它提供了一種使用 Http協議,使其能在Internet上穿越防火牆傳輸序列化消息流。HttpChannel類型使用Soap格式序列化消息對象,因此它具有更好的互操作性。適用萬維網。
這裡寫的比較好:http://kb.cnblogs.com/page/50681/
簡單的理解:我們知道,在我們的Remoting應用需要遠程處理對象,那麼這些對象是怎麼創建的?又是由誰去創建的呢?… 而激活方式則正是要說明這些疑問。
遠程對象的激活分為兩大類:服務器端激活(WellKnow)和客戶端激活。
服務器端激活有兩種模式:SingleTon模式和SingleCall。1.創建遠程處理的類型(由於Remoting傳遞的對象是以引用的方式,因此所傳遞的遠程對象類必須繼承MarshalByRefObject。)
2.創建服務端
3.創建客戶端
MarshalByRefObject 是那些通過使用代理交換消息來跨越應用程序域邊界進行通信的對象的基類。
不是從 MarshalByRefObject 繼承的對象會以隱式方式按值封送。
當遠程應用程序引用一個按值封送的對象時,將跨越遠程處理邊界傳遞該對象的副本。
因為您希望使用代理方法而不是副本方法進行通信,因此需要繼承MarshallByRefObject。
在Remoting中能夠傳遞的遠程對象可以是各種類型,包括復雜的DataSet對象,只要它能夠被序列化。遠程對象也可以包含事件,但服務器端對於事件的處理比較特殊(後續詳解)。
1.編寫遠程處理類
using System; using System.Runtime.Remoting.Metadata; /*code 釋迦苦僧*/ namespace MessageMarshal { /*創建發送消息委托*/ public delegate void SendMessageHandler(string messge); public class TestMessageMarshal : MarshalByRefObject { /*創建發送消息事件*/ public static event SendMessageHandler SendMessageEvent; /*發送消息*/ [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")] public void SendMessage(string messge) { if (SendMessageEvent != null) SendMessageEvent(messge); } } }
2.創建服務端
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; namespace TestRemotingServer { /*code:釋迦苦僧*/ class Program { static void Main(string[] args) { Console.WriteLine("創建HTTP通道"); /*創建HTTP通道*/ HttpChannel channel = new HttpChannel(816); /*注冊通道服務端*/ ChannelServices.RegisterChannel(channel, false); /*服務端注冊,使用Singletong激活*/ RemotingConfiguration.RegisterWellKnownServiceType(typeof(MessageMarshal.TestMessageMarshal), "TestMessageMarshal", WellKnownObjectMode.Singleton); /*接收客戶端事件*/ MessageMarshal.TestMessageMarshal.SendMessageEvent += new MessageMarshal.SendMessageHandler(TestMessageMarshal_SendMessageEvent); Console.Read(); } static void TestMessageMarshal_SendMessageEvent(string messge) { Console.WriteLine(messge); } } }
3.創建客戶端
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using System.Threading; /*code 釋迦苦僧*/ namespace TestRemotingClient { class Program { static void Main(string[] args) { /*創建通道*/ HttpChannel channel = new HttpChannel(); /*注冊通道*/ ChannelServices.RegisterChannel(channel, false); /*注冊通道 的 遠程處理類型*/ RemotingConfiguration.RegisterWellKnownClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:816/test"); /*創建消息實體*/ MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal(); while (true) { TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString()); Console.WriteLine("send message..."); Thread.Sleep(2000); } } } }
4.測試
暫時寫到這,如有問題歡迎指正!後續繼續更新
作者:釋迦苦僧 出處:http://www.cnblogs.com/woxpp/p/3992771.html 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
Web Service 和Remoting之間得區別,從體系結構上來說:
Web Service大體上分為5個層次:
1. Http傳輸信道
2. XML的數據格式
3. SOAP封裝格式
4. WSDL的描述方式
5. UDDI
.NET 下的 Web Service結構比較簡單,也比較容易理解和應用:
一般來講在.NET結構下的WebService應用都是基於.net framework以及IIS的架構之下,所以部署起來相對比較容易點.
從實現的角度來講,
首先WebService必須把暴露給客戶端的方法所在的類繼承於:System.Web.Services.WebService這個基類
其次所暴露的方法前面必須有[WebMethod]或者[WebMethodAttribute]
WebService的運行機理
首先客戶端從服務器的到WebService的WSDL,同時在客戶端聲稱一個代理類(Proxy Class)
這個代理類負責與WebService服務器進行Request 和Response
當一個數據(XML格式的)被封裝成SOAP格式的數據流發送到服務器端的時候,就會生成一個進程對象並且把接收到這個Request的SOAP包進行解析,然後對事物進行處理,處理結束以後再對這個計算結果進行SOAP包裝,然後把這個包作為一個Response發送給客戶端的代理類(Proxy Class),同樣地,這個代理類也對這個SOAP包進行解析處理,繼而進行後續操作。
這就是WebService的一個運行過程。
而.net Remoting是:
.net Remoting 是在DCOM等基礎上發展起來的一種技術,它的主要目的是實現跨平台、跨語言、穿透企業防火牆,這也是他的基本特點,與WebService有所不同的是,它支持HTTP以及TCP信道,而且它不僅能傳輸XML格式的SOAP包,也可以傳輸傳統意義上的二進制流,這使得它變得效率更高也更加靈活。而且它不依賴於IIS,用戶可以自己開發(Development)並部署自己喜歡的宿主服務器,所以從這些方面上來講WebService其實上是.net Remoting的一種特例。
WebService 和Remoting比較如下:
WebService的特點是:平台獨立性(Platform-independent)、跨語言(只要能支持XML的語言都可以) 以及穿透企業防火牆
但是它的缺點也很明顯,就是需要部署一台Web Server;而且速度比較慢;
.net Remoting的特點是
他的優點是用戶既可以使用TCP信道方式進行二進制流方式通信,也可以使用HTTP信道進行SOAP格式的性通信
效率相對WebService要高不少;但是它的缺點也很明顯,.net remoting只能應用於MS 的.net framework之下。
從性能上來講Remoting的效率和傳統的DCOM、COM+的性能很相近!
.NET 遠程處理為進程間通信提供了一種抽象的方法,它將可遠程處理的對象與特定客戶端或服務器應用程序域以及特定的通信機制隔離開來。因此,這很靈活且很容易自定義。可以用一種通信協議替換另一種通信協議,或者用一種序列化格式替換另一種序列化格式,而不必重新編譯客戶端或服務器。此外,遠程處理系統假定沒有特別的應用程序模型。可以從 Web 應用程序、控制台應用程序、Windows 服務,即差不多可以從希望使用的任何程序中進行通信。遠程處理服務器也可以是任何類型的應用程序域。任何應用程序都可以承載遠程處理對象並向其計算機或網絡上的任何客戶端提供服務。
System.Runtime.Remoting 命名空間提供允許開發人員創建和配置分布式應用程序的類和接口。System.Runtime.Remoting 命名空間的一些更重要的類是 RemotingConfiguration 類、RemotingServices 類和 ObjRef 類。
RemotingConfiguration 類包含用於與配置設置銜接的靜態方法。RemotingConfiguration.Configure 方法允許開發人員通過使用 XML 格式化配置文件來配置遠程處理基礎結構。RemotingConfiguration 類還包含若干在客戶端和服務器端注冊駐留在服務器上的客戶端激活對象和服務器端激活對象的方法。
RemotingServices 類提供若干幫助使用和發布遠程對象的方法。System.Runtime.Remoting.RemotingServices.Marshal 方法提供在 ObjRef 類的實例中存儲激活遠程對象並與之通信所需的所有相關信息供以後序列化和傳輸到遠程位置使用的功能。System.Runtime.Remoting.RemotingServices.Unmarshal 方法反轉此過程,為遠程對象創建可由應用程序使用的代理,不考慮任何遠程處理分支。
ObjRef 類保存激活遠程對象並與之通信所需的所有相關信息。該類是通過信道傳輸到遠程位置的對象的序列化表示形式,在信道中它被取消封送(請參見 Unmarshal)並可用於創建遠程對象的本地代理。
以上這些都是MSDN的資料,要學會看MSDN。