zoukankan      html  css  js  c++  java
  • .NET Remoting程序开发入门篇(三)

    四、客户端

      客户端主要做两件事,一是注册通道。这一点从图一就可以看出,Remoting中服务器端和客户端都必须通过通道来传递消息,以获得远程对象。第二步则是获得该远程对象。

      1、注册通道:

    TcpChannel channel = new TcpChannel();
    ChannelServices.RegisterChannel(channel);

      注意在客户端实例化通道时,是调用的默认构造函数,即没有传递端口号。事实上,这个端口号是缺一不可的,只不过它的指定被放在后面作为了Uri的一部分。

      2、获得远程对象。

      与服务器端相同,不同的激活模式决定了客户端的实现方式也将不同。不过这个区别仅仅是WellKnown激活模式和客户端激活模式之间的区别,而对于SingleTon和SingleCall模式,客户端的实现完全相同。

       (1) WellKnown激活模式

      要获得服务器端的知名远程对象,可通过Activator进程的GetObject()方法来获得:

    ServerRemoteObject.ServerObject serverObj = (ServerRemoteObject.ServerObject)Activator.GetObject(
    typeof(ServerRemoteObject.ServerObject), "tcp://localhost:8080/ServiceMessage");


      首先以WellKnown模式激活,客户端获得对象的方法是使用GetObject()。其中参数第一个是远程对象的类型。第二个参数就是服务器端的uri。如果是http通道,自然是用http://localhost:8080/ServiceMessage了。因为我是用本地机,所以这里是localhost,你可以用具体的服务器IP地址来代替它。端口必须和服务器端的端口一致。后面则是服务器定义的远程对象服务名,即ApplicationName属性的内容。

      (2) 客户端激活模式

      如前所述,WellKnown模式在客户端创建对象时,只能调用默认的构造函数,上面的代码就说明了这一点,因为GetObject()方法不能传递构造函数的参数。而客户端激活模式则可以通过自定义的构造函数来创建远程对象。

      客户端激活模式有两种方法:

      1) 调用RemotingConfiguration的静态方法RegisterActivatedClientType()。这个方法返回值为Void,它只是将远程对象注册在客户端而已。具体的实例化还需要调用对象类的构造函数。

    RemotingConfiguration.RegisterActivatedClientType( typeof(ServerRemoteObject.ServerObject),
    "tcp://localhost:8080/ServiceMessage");
    ServerRemoteObject.ServerObject serverObj = new ServerRemoteObject.ServerObject();


      2) 调用进程Activator的CreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的GetObject()不同的是,它要在客户端调用构造函数,而GetObject()只是获得对象,而创建实例是在服务器端完成的。CreateInstance()方法有很多个重载,我着重说一下其中常用的两个。

       a、 public static object CreateInstance(Type type, object[] args, object[] activationAttributes);

      参数说明:

      type:要创建的对象的类型。
      args :与要调用构造函数的参数数量、顺序和类型匹配的参数数组。如果 args 为空数组或空引用(Visual Basic 中为 Nothing),则调用不带任何参数的构造函数(默认构造函数)。
      activationAttributes :包含一个或多个可以参与激活的属性的数组。

      这里的参数args是一个object[]数组类型。它可以传递要创建对象的构造函数中的参数。从这里其实可以得到一个结论:WellKnown激活模式所传递的远程对象类,只能使用默认的构造函数;而Activated模式则可以用户自定义构造函数。activationAttributes参数在这个方法中通常用来传递服务器的url。

      假设我们的远程对象类ServerObject有个构造函数:

    ServerObject(string pName,string pSex,int pAge)
    {
     name = pName;
     sex = pSex;
     age = pAge;
    }


      那么实现的代码是:

    object[] attrs = {new UrlAttribute("tcp://localhost:8080/ServiceMessage")};
    object[] objs = new object[3];
    objs[0] = "wayfarer";
    objs[1] = "male";
    objs[2] = 28;
    ServerRemoteObject.ServerObject = Activator.CreateInstance(
    typeof(ServerRemoteObject.ServerObject),objs,attrs);


      可以看到,objs[]数组传递的就是构造函数的参数。

      b、public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);

      参数说明:

      assemblyName :将在其中查找名为 typeName 的类型的程序集的名称。如果 assemblyName 为空引用(Visual Basic 中为 Nothing),则搜索正在执行的程序集。
      typeName:首选类型的名称。
      activationAttributes :包含一个或多个可以参与激活的属性的数组。

      参数说明一目了然。注意这个方法返回值为ObjectHandle类型,因此代码与前不同:

    object[] attrs = {new UrlAttribute("tcp://localhost:8080/EchoMessage")};
    ObjectHandle handle = Activator.CreateInstance("ServerRemoteObject",
    "ServerRemoteObject.ServerObject",attrs);
    ServerRemoteObject.ServerObject obj = (ServerRemoteObject.ServerObject)handle.Unwrap();


      这个方法实际上是调用的默认构造函数。ObjectHandle.Unwrap()方法是返回被包装的对象。

      说明:要使用UrlAttribute,还需要在命名空间中添加:using System.Runtime.Remoting.Activation;

  • 相关阅读:
    leetcode204-统计质数个数之一步步调试超时
    SpringBoot-注解一句话
    算法-总结规律
    kafka-版本变更相关
    异步线程池如何做同步业务
    es-快捷DSL检索手记
    并发学习第七篇——ThreadPoolExecutor
    kafka-consumer端的设计细节
    kafka-producer使用总结
    kafka-topic重要配置分析
  • 原文地址:https://www.cnblogs.com/goody9807/p/800303.html
Copyright © 2011-2022 走看看