现在的位置: 首页 > 综合 > 正文

.Net中Remoting技术应用简述

2013年03月29日 ⁄ 综合 ⁄ 共 2786字 ⁄ 字号 评论关闭

一,Remoting技术简介:

.Net Remoting 技术是.NET平台上实现分布式对象系统的框架,它可以用于访问另一个应用程序域(也可以是另一个服务器)中的对象,可以是进程间的,也可以是不同系统的进程间,这种CS式的通讯机制更为快速方便。其实质就是:客户端创建服务端对象的代理并调用其方法,通过信道网络传输到服务端,在服务端上处理客户端传递过来的参数数据并返回处理结果(如果有的话)给客户端的接收变量。这种方式与传统上的方法调用明显不同,它轻松实现了数据的分布式处理。

理解Remoting框架的基本原理

.NET Remoting构建分布式数据库查询

.NET Remoting体系结构图

.NET Remoting中通过通道(channel)来实现两个应用程序域之间的对象通信。Remoting的通道主要有两种:Tcp和Http。在.NET中,System.Runtime.Remoting.Channel中定义了IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。通道对象代表了到远程应用程序的连接。每个通道对象还包含格式化程序对象,将方法调用转换为已知格式的消息。

二,Remoting应用的两种实现方式:

Remoting应用通常分为三部分:客户端,服务端和远程类。客户端是调用方,相关于下命令的上级,服务端就是处理数据的一方,相当于接收指令干活的下级,而远程类就是传递的数据,相关于命令的载体。一个完整的Remoting应用当然也要包括这三个部分。通常,有两种方式来实现Remoting应用:比较常用的是编写代码的方式,另一种是利用配置文件的方式,但不管采用两种方式,编写一个远程类的必须的。

1,两种方式都要用到的远程类型类:

通常,我们需要编写一个DLL,其中包含客户端和服务端都需要用到的远程类,这个类必须从System.MarshalByRefObject继承。以下是一个简单的示例:

namespace RemoteObject
{
    public class RemoteObjClass : System.MarshalByRefObject
    {
        public int Multi(int a, int b)
        {
            return a * b;
        }
    }
}
我们将这个类保存在程序集名称为RemoteObject项目中,编译后,就会生成RemoteObject.dll,以供接下来的客户端和服务端调用。
因为,不管是客户端还是服务器,都需要正确引用该远程类。
2,服务端:
服务端提供服务,它需要服务器进程注册上面的远程类,以便其他应用程序(即客户端)可以激活并正确调用它。
1),编写代码的方式:
根据该对象是如何激活,服务器通过两种静态方法来注册:
RegisterActivatedServiceType:将服务端上的对象 Type 注册为可根据请求从客户端激活的类型。
或者RegisterWellKnownServiceType:在服务器上将某对象类型注册为已知对象类型。
下面的语句使用RegisterWellKnownServiceType来注册RemoteObjClass,以便远程激活:

TcpChannel chnl = new TcpChannel(8888);//服务端为当前远程调用启用的侦听端口号
ChannelServices.RegisterChannel(chnl, true);
RemotingConfiguration.RegisterWellKnownServiceType(
Type.GetType("RemoteObject.RemoteObjClass,RemoteObject"), //远程类所有在程序集路径及名称
"SampleRemote", //远程调用时的路径
WellKnownObjectMode.Singleton);
2),利用配置文件实现:

首先,需要配置配置文件如下所示:




   
     
       
       

       

       

       

     
     
       
       

     
   

接着,还是需要我们在代码中编写以下代码:

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,false);

以上两种方式,都可以激活服务端,当客户端程序调用远程对象时,就是在服务端自动执行处理了。 

3,客户端:

1),编写代码的方式:

TcpClientChannel chnl = new TcpClientChannel();
ChannelServices.RegisterChannel(chnl, true);//注册通信通道
RemoteObjClass RemonteObj = //获取远程对象代理
(RemoteObjClass)Activator.GetObject(
Type.GetType("RemoteObject.RemoteObjClass,RemoteObject"),//远程类所有在程序集路径及名称
"tcp://localhost:8888/SampleRemote");//调用时用到的URI
Console.WriteLine(RemonteObj.Multi(3,6));//调用远程类中的方法
2),利用配置文件实现:
配置文件的内容如下:




   
     
       
     

       

       
         
         

       
   

接着,还是需要我们在代码中编写以下代码:

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, false);

RemoteObjClass RemonteObj = new RemoteObjClass ();

Console.WriteLine(RemonteObj.Multi(3,6));

三,总结:

.Net Remoting分布式开发比较适用于局网内的程序通信,特别是windows与windows、web与windwos等,充分体现.Net Remoting的效率。本文介绍了Remoting技术的基本原理与简单应用,着重讲述了Remoting技术的两种实现方式,需要注意的是,在不再使用信道的时候,要及时调用ChannelServices.UnregisterChannel()方法来注销掉。小可刚接触Remoting技术不久,不当之处,请批评指正,也希望对读者朋友的参考价值。更多相关知识,可以参考:http://www.cnblogs.com/rickie/category/5082.html

《完》

【上篇】
【下篇】

抱歉!评论已关闭.