天天看點

.NET Remoting學習筆記(一)概念

原文: .NET Remoting學習筆記(一)概念

目錄

背景

自接觸程式設計以來,一直聽過這個名詞Remoting,但是對他了解少之又少,近日有點時間,參考研究研究。

其相關概念本章不做詳解,具體大家可以看下 

http://baike.baidu.com/view/742675.htm?fr=aladdin

  ,寫的很詳細。

.Net Remoting概念

概念:一種分布式處理方式。從微軟的産品角度來看,可以說Remoting就是

DCOM

 (分布式元件對象模式)的一種更新,它改善了很多功能,并極好的融合到.Net平台下。

好處:

1.提供了一種允許對象通過應用程式域與另一對象進行互動的架構。

在Windows作業系統中,是将應用程式分離為單獨的程序。這個程序形成了應用程式代碼和資料周圍的一道邊界。如果不采用程序間通信(RPC)機制,則在一個程序中執行的代碼就不能通路另一程序。這是一種作業系統對應用程式的保護機制。然而在某些情況下,我們需要跨過應用程式域,與另外的應用程式域進行通信,即穿越邊界。

2.可以服務的方式來釋出伺服器對象:

代碼可以運作在伺服器上(如伺服器激活的對象和用戶端激活的對象),然後用戶端再通過Remoting連接配接伺服器,獲得該服務對象并通過序列化在用戶端運作。

3.用戶端和伺服器端有關對象的松散耦合

在Remoting中,對于要傳遞的對象,設計者除了需要了解通道的類型和端口号之外,無需再了解資料包的格式。這既保證了用戶端和伺服器端有關對象的松散耦合,同時也優化了通信的性能。

.NET Remoting支援通道與協定

Remoting的通道主要有兩種:Tcp和Http,IChannel 包含TcpChannel,HttpChannel

TcpChannel:Tcp通道提供了基于Socket 的傳輸工具,使用Tcp協定來跨越Remoting邊界傳輸序列化的消息流。預設使用二進制格式序列化消息對象,具有更高的傳輸性能。适用區域網路。

HttpChannel:它提供了一種使用 Http協定,使其能在Internet上穿越防火牆傳輸序列化消息流。HttpChannel類型使用Soap格式序列化消息對象,是以它具有更好的互操作性。适用網際網路。 

與WCF、WebService 差別

這裡寫的比較好:

http://kb.cnblogs.com/page/50681/
  • Remoting可以靈活的定義其所基于的協定,比如http,tcp等,如果定義為HTTP,則與Web Service相同,但是webservice是無狀态的,使用remoting一般都喜歡定義為TCP,這樣比Web Service稍為高效一些,而且是有狀态的。 
  • Remoting不是标準,而Web Service是标準。 
  • Remoting一般需要通過一個WinForm或是Windows服務進行啟動,也可以使用iis部署,而Web Service則必須在IIS進行啟動。 
  • 在VS.net開發環境中,專門對Web Service的調用進行了封裝,用起來比Remoting友善。 
  • net remoting隻能應用于MS 的.net framework之下,需要用戶端必須安裝framework,但是WebService是平台獨立的,跨語言(隻要能支援XML的語言都可以) 以及穿透企業防火牆。

.NET Remoting激活方式

簡單的了解:我們知道,在我們的Remoting應用需要遠端處理對象,那麼這些對象是怎麼建立的?又是由誰去建立的呢?… 而激活方式則正是要說明這些疑問。

遠端對象的激活分為兩大類:伺服器端激活(WellKnow)和用戶端激活。

伺服器端激活有兩種模式:

SingleTon模式和SingleCall。

實作Remoting步驟

1.建立遠端處理的類型(由于Remoting傳遞的對象是以引用的方式,是以所傳遞的遠端對象類必須繼承MarshalByRefObject。)

2.建立服務端

3.建立用戶端

MarshalByRefObject

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);
        }
    }
}      
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);
        } 
    }
}      
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/TestMessageMarshal");  
            /*建立消息實體*/
            MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();

            while (true)
            {
                TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
                Console.WriteLine("send message...");
                Thread.Sleep(2000);
            }
        }
    }
}      

4.測試

.NET Remoting學習筆記(一)概念

暫時寫到這,如有問題歡迎指正!後續繼續更新

作者:釋迦苦僧 出處:

http://www.cnblogs.com/woxpp/p/3992771.html

 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。

繼續閱讀