幸运星空

Lucker的程序人生

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一,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),利用配置文件实现:

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

<?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

《完》

posted on 2011-01-18 11:00  Lucker  阅读(524)  评论(0编辑  收藏  举报