一,Remoting技术简介:
.Net Remoting 技术是.NET平台上实现分布式对象系统的框架,它可以用于访问另一个应用程序域(也可以是另一个服务器)中的对象,可以是进程间的,也可以是不同系统的进程间,这种CS式的通讯机制更为快速方便。其实质就是:客户端创建服务端对象的代理并调用其方法,通过信道网络传输到服务端,在服务端上处理客户端传递过来的参数数据并返回处理结果(如果有的话)给客户端的接收变量。这种方式与传统上的方法调用明显不同,它轻松实现了数据的分布式处理。
理解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),利用配置文件实现:
首先,需要配置配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting><!--.net remoting配置的根节点-->
<application><!--包含有关远程应用程序使用及公共的对象信息-->
<service><!--服务器端,用于指定以什么方式公开什么对象-->
<wellknown mode="Singleton" type="RemoteObject.RemoteObjClass,RemoteObject" objectUri="SampleRemote"/>
<!--与wellknown相对是activated,wellknown表示服务器端激活对象,后者为客户端激活对象-->
<!--mode表示如何响应客户端请求,Singleton表示单一实例-->
<!--type表示要公开的类型,选择指定类型名称(含名称空间),然后指定类型所属.dll文件-->
<!--objectUri表示远程对象访问路径-->
</service>
<channels><!--用于指定通道信息,可心同时指定多个通道-->
<channel port="8888" ref="tcp"/><!--具体的通道信息,port为端口号,ref为引用的通道类型-->
<!--.net 框架提供了http与tcp通道-->
</channels>
</application>
</system.runtime.remoting>
</configuration>接着,还是需要我们在代码中编写以下代码:
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),利用配置文件实现:配置文件的内容如下:<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown url="http://127.0.0.1:8888/SampleRemote" type="RemoteObject.RemoteObjClass,RemoteObject"/>
</client>
<!--远程对象访问路径,域名与IP地址都可以-->
<channels>
<channel port="0" ref="tcp"/>
<!--port为0表示客户端不侦听任何端口-->
</channels>
</application>
</system.runtime.remoting>
</configuration>接着,还是需要我们在代码中编写以下代码:
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
《完》
※※※※※※※※※※※※※※--我的程序人生--※※※※※※※※※※※※※※