初识用.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

相关文章
相关标签/搜索