初識用.NET Remoting來開發分佈式應用

一..NET Remoting簡介:html

.NET Remoting從某種意義上講是DCOM的替代品。ASP.NET Web服務十分有用,可是這項技術在企業內聯網的解決方案中,對於某些業務請求來講並不快,也沒有足夠的靈活性,並且,ASP.NET Web服務須要有運行時的支持。使用.NET Remoting技術後,能夠將Web服務提供給世界上的任何地方。並且能夠在全部的應用程序類型中運行Web服務。數組

二..NET Remoting 的基本原理:服務器

體系結構圖以下:異步

 

三.幾個重要的概念:tcp

1.遠程對象:分佈式

遠程對象類是從MarshalByRefObject類中派生的。跨越應用程序域調用這個類須要使用代理。.NET Remoting支持兩種類型的遠程對象:知名的(Well-known)遠程對象和客戶激活(Client-activated)遠程對象。遠程對象其實包括兩層含義:spa

操做遠程對象:對象運行在遠程,客戶段向他發送消息;代理

傳遞遠程對象:將遠程對象拿到本地,或者將本地對象發送過去,對副本進行操做。日誌

2.激活:code

使用new運算符能夠激活遠程對象。還有其它一些方式也能夠激活遠程對象,在之後的隨筆裏面我會介紹。

3.通道:

一個遠程對象使用通道發送和接收消息。服務器選擇一個通道來監聽請求,客戶端選擇通道來和服務器通信。Remoting提供了內置的通道:TCP通道和HTTP通道,咱們也能夠編寫本身的通道。

4.編組:

數組經過應用程序域被傳遞的過程稱爲編組。將變量做爲遠程對象的參數來發送時,這個變量必須被轉換,以便可以經過應用程序域發送該變量。

5.監聽:

使用監聽,可以將某些功能置入到方法調用鏈中。若是調用某個對象的方法,監聽層便可以捕獲調用來轉換方法調用,或是完成某些日誌記錄。.NET Remoting調用鏈的每一部分都是用監聽。

四.開發Remoting三步走:

開發.NET Remoting分三步走,在這裏以一個簡單的例子來講明。

1.建立遠程對象:

繼承System.MarshalByRefObject

using System;
using System.Collections;
using System.Text;

namespace SimpleRemoting
{
    public class HelloServer : MarshalByRefObject
    {
        public HelloServer()
        {
            ///輸出信息,服務器激活
            Console.WriteLine("服務器激活……");
        }
        public String HelloMethod(String name)
        {
            Console.WriteLine(
                "服務器端 : {0}", name);
            return "這裏是:" + name;
        }
    }
}

 

2.建立宿主應用程序:

註冊通道

註冊服務器激活的遠程對象

運行宿主程序

using System;
using System.Net;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;

namespace SimpleRemoting 
{

    public class Server
    {
        public static int Main(string [] args) 
        {
            
            ///建立Tcp通道
            TcpChannel chan1 = new TcpChannel(8085);

            ///建立Http通道
            HttpChannel chan2 = new HttpChannel(8086);
            
            ///註冊通道
            ChannelServices.RegisterChannel(chan1);
            ChannelServices.RegisterChannel(chan2);

            RemotingConfiguration.RegisterWellKnownServiceType
                (
                typeof(HelloServer),
                "SayHello",
                WellKnownObjectMode.Singleton
                );
            

            System.Console.WriteLine("按任意鍵退出!");
            ///下面這行不能少
            System.Console.ReadLine();
            return 0;
        }

    }
}

 

3.創建客戶端程序:

註冊通道

根據URL獲得對象代理

使用代理調用遠程對象

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using System.IO;

namespace SimpleRemoting 
{
    public class Client
    {
        public static void Main(string[] args)
        {
            ///使用TCP通道獲得遠程對象
            TcpChannel chan1 = new TcpChannel();
            ChannelServices.RegisterChannel(chan1);

            HelloServer obj1 = (HelloServer)Activator.GetObject(
                typeof(SimpleRemoting.HelloServer),
                "tcp://localhost:8085/SayHello");

            if (obj1 == null)
            {
                System.Console.WriteLine(
                    "鏈接TCP服務器失敗");
            }

            ///使用HTTP通道獲得遠程對象
            HttpChannel chan2 = new HttpChannel();
            ChannelServices.RegisterChannel(chan2);

            HelloServer obj2 = (HelloServer)Activator.GetObject(
                typeof(SimpleRemoting.HelloServer),
                "http://localhost:8086/SayHello");

            if (obj2 == null)
            {
                System.Console.WriteLine(
                    "鏈接HTTP服務器失敗");
            }
            
            ///輸出信息
            Console.WriteLine(
                "ClientTCP HelloMethod {0}",
                obj1.HelloMethod("Caveman1"));
            Console.WriteLine(
                "ClientHTTP HelloMethod {0}",
                obj2.HelloMethod("Caveman2"));
            Console.ReadLine();
        }
    }
}

 

結束語:初識用.NET Remoting來開發分佈式應用就到這裏了,有時間我會就.NET Remoting技術寫成系列文章。包括基於租約的生存期,編組,異步遠程調用等等。

出處:http://www.cnblogs.com/Terrylee/archive/2005/11/03/267621.html

相關文章
相關標籤/搜索