1. 程式人生 > >【轉載】.NET Remoting學習筆記(一)概念

【轉載】.NET Remoting學習筆記(一)概念

leg false 情況下 system 版權 while 對象模式 無需 new

目錄
  • .NET Remoting學習筆記(一)概念
  • .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);
        }
    }
}

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/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.測試
技術分享

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

作者:釋迦苦僧 出處:http://www.cnblogs.com/woxpp/p/3992771.html

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

【轉載】.NET Remoting學習筆記(一)概念