用 .NET Remoting 进行分布式计算

贾宇 林凡刚 左晓英

(黑龙江信息技术职业学院 计算机工程系,黑龙江 哈尔滨 150086)

摘 要:随着计算机软硬件的发展,各行各业对计算机的应用也越来越广,其中企业网对分布式计算的需求也日益强烈,过去主要应用DCOM来         开发,如今采用.NET Remoting 开发,开发效率更高了,速度也更快了。
关键词:计算机;分布式计算;.NET Remoting

引言
  (1).NET Remoting:表示分布式组件技术的下一代,是DCOM的替代产品,是利用运行库的服务调用运行在不同应用程序域中的对象的方法并共享其数据。
  (2)应用程序域:是.NET运行库的逻辑进程表示。任何实际的操作系统进程都可以包含多个应用程序域。应用程序域是被隔离的,所有.NET对象都会被界定在创建它的应用程序域中。如果跨应用程序域的边界传递对象引用,该被引用的对象就被称之为远程对象。
  (3)通道:是一种远程框架,隐藏了在客户和服务器应用程序间通信时所使用的底层线路协议的复杂性。通道对象最终用来将每个方法调用从客户端传送到服务器端,如果需要的话,将返回值传回客户端。
  开发时需要构建服务器端和客户端,服务器端可以运行在任意的应用程序类型中:控制台应用程序,Windows Forms 应用程序,Windows 服务,以及诸如此类的应用程序中。
1 构建服务器端
  实现分布式计算首先要构建服务器端,构建服务器端的步骤如下:
  (1)添加对System.Runtime.Remoting.dll程序集的引用;
  (2)实现一个派生自MarshalByRefObject的类;
  (3)选择一种可用的通道(TCP或HTTP),并注册通道;
  (4)保持服务器端一直处于激活状态等待客户请求;
  创建一个派生自MarshalByRefObject的SimpleMath类如下:
  using System;
  namespace MathLibrary
  {
  public class SimpleMath:MarshalByRefObject
  {
  public SimpleMath()
  {
  Console.WriteLine("SimpleMath ctor called");
  }
  public int Add(int n1, int n2)
  {
  Console.WriteLine("SimpleMath.Add({0},{1})",n1,n2);
  return n1 + n2;
  }
  }
  }
  创建一个应用程序MathServer,在其中建立一个通道,并将SimpleMath类注册为一个已知对象。可以通过配置文件或通过调用  RemotingConfi8guration.RegisterWellKonwServiceType方法实现SimpleMath类的注册。
  运行MathServer应用程序,启动服务器端,保持服务器端一直处于激活状态等待客户请求。
2 构建客户端
  创建代理类项目MathLibraryCust,其中的命名空间的名称和类名都与MathLibrary项目中对应的名称完全匹配,所有方法的名称也都相匹配。然而,两者的实现是大不相同的。实际上,因为MathLibraryCust项目中的方法从不会被执行,它们都引发一个异常。这样,如果一个客户端具有不正确的远程设置并且错误地创建了一个本地SimpleMath对象,那么它的方法会引发一个异常。程序如下:
  using System;
  namespace MathLibrary
  {
  public class SimpleMath : MarshalByRefObject
  {
  public SimpleMath()
  {
  throw new NotFiniteNumberException("Method cannot be run locally");
  }
  public int Add(int n1, int n2)
  {
  throw new NotFiniteNumberException("Method cannot be run locally");
  }
  }
  }
  创建客户端程序,在其中引用代理类。在创建使用这个远程SimpleMath类型的客户端应用程序时,要了解四个远程服务器端的信息:
  .驻留服务器应用程序的机器名称。
  .服务器端用来提供对象的通道类型。
  .服务器端用来监听请求的端口号。
  .分配给远程对象的URI。
  建立客户端程序,如下:
  using System;
  using System.Runtime.Remoting;
  using MathLibrary;//代理类命名空间引用
  namespace MathClient
  {
  class ClientMain
  {
  static void Main(string[] args)
  {
  RemotingConfiguration.Configure("MathClient.exe.config");//读取配置文件创建通道
  SimpleMath();//创建远程对象
  Console.WriteLine("10+6={0}", math.Add(10, 6));//调用远程对象方法
  }
  }
  }
  运行客户端程序,发现程序不能正确运行。为什么?因为我们忘记修改元数据程序集的名称,它不能与实现程序集的名称相匹配。必须将  MathLibraryCust项目的程序集修改为MathLibrary,然后在客户端程序中重新应用。程序运行正常。


(责任编辑:范立红)


参考文献
[1] (美) TOM BARNABY 著..NET 分布式编程 –c#篇.黎媛 王小锋等译
[2] Ashish Banerjee? Aravind Corera 等著.C#Web服务高级编程.康博译

作者简介:
贾宇(1961-),男,黑龙江信息技术职业学院,计算机工程系,副教授,研究方向:计算机教学与项目开发。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



                                                             关闭本页


主管单位:黑龙江省信息产业厅   主办单位:黑龙江信息技术职业学院   编辑:<<信息与通信职业教育>>编辑部  邮政编码:150086
准印证号:黑新出印字 2300090   地址:哈尔滨市南岗区学府路392号    电话:0451-86650628           E-mail:hljive@163.com