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

目錄
  • .NET Remoting學習筆記(一)概念
  • .NET Remoting學習筆記(二)激活方式
  • .NET Remoting學習筆記(三)信道
背景

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

其相關概念本章不作詳解,具體你們能夠看下  http://baike.baidu.com/view/742675.htm?fr=aladdin  ,寫的很詳細。 web

.Net Remoting概念

概念:一種分佈式處理方式。從微軟的產品角度來看,能夠說Remoting就是DCOM (分佈式組件對象模式)的一種升級,它改善了不少功能,並極好的融合到.Net平臺下。 編程

好處: 服務器

1.提供了一種容許對象經過應用程序域與另外一對象進行交互的框架。 框架

在Windows操做系統中,是將應用程序分離爲單獨的進程。這個進程造成了應用程序代碼和數據周圍的一道邊界。若是不採用進程間通訊(RPC)機制,則在一個進程中執行的代碼就不能訪問另外一進程。這是一種操做系統對應用程序的保護機制。然而在某些狀況下,咱們須要跨過應用程序域,與另外的應用程序域進行通訊,即穿越邊界。 tcp

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;

namespace MessageMarshal
{
    /*建立發送消息委託*/
    public delegate void SendMessageHandler(string messge);

    [Serializable]
    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
{
    public 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;

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 

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

相關文章
相關標籤/搜索