zoukankan      html  css  js  c++  java
  • C# .net remoting 学习笔记一

    .net remoting 实现了跨进程对象间的访问(被访问的对象仅限于远程对象),可以作为进程间通信的一种方法。

    现在将我理解的整理出来,有不对的地方请指正。文中所提的函数多有重载函数,我只是实验了其中的一种,

    所以其它的函数是否也能使用,及如何使用。

    文中例子远程对象类如下

     1 namespace Remotenamesapce
     2 {
     3     public class RObjectClass : MarshalByRefObject
     4     {
     5         public RObjectClass()
     6         {
     7 
     8         }
     9     }
    10 }
    View Code

    1. 使用步骤:(1)定义信道 (2)注册信道 (3)注册远程对象类型。

    2. 定义信道 

    (1) ChannelServers 信道管理类。信道结构图如下:

    其中继承IChannelSender 和 IChannelReceiver的类在客户端和服务端都可以使用。而TcpClientChannel只能在客户端使用。

    TcpServerChannel只能在服务端使用。

     (2) 用户可以自定义信道。

    3. 注册信道

         ChannelServers.RegisterChannel()将信道注册到.Net Remoting 运行库中。ChannelServiers还可以访问已注册的信道。

    4. 注册远程对象类型

        服务端:

       (1)注册服务端激活对象

        RemotingConfiguration.RegisterWellKnownServiceType(typeof(RObjectClass),"strurl",WellKnownObjectMode.SingleCall);

        WellKnownObjectMode.SingleCall : 为每个客户端请求实例化一个远程对象。

        WellKnownObjectMode.Singleton : 每个客户端请求都由同一个对象提供服务。

        (2)客户端激活对象 当希望客户端的操作是有状态的时候,可以考虑使用这种对象。

                RemotingConfiguration.ApplicationName = "strurl"; // msdn上说是获取或设置远程处理应用程序的名称,我将其理解成

    远程对象在信道中的名称。

         RemotingConfiguration.RegisterActivatedServiceType(typeof(RObjectClass));

         客户端:

          (1)获取服务器激活的远程对象

        方法一:使用Activator.GetObject; 例如:

              RObjectClass obj = (RObjectClass)Activator.GetObject(typeof(RObjectClass),"tcp://localhost:8085/strurl");

               方法二:使用RemotingServices.Connect, 例如:

              RObjectClass obj = (RObjectClass)RemotingServices.Connect(typeof(RObjectClass), "tcp://localhost:8085/strurl");

               方法三:使用使用new ,例如:

               RemotingConfiguration.RegisterWellKnownClientType(typeof(RObjectClass), "tcp://localhost:8085/strurl");

               RObjectClass obj = new RObjectClass();

          (2)激活客户端激活对象

               方法一:使用Activator.CreateInstance ,例如:

               object[] attrs = { new UrlAttribute("tcp://localhost:8085/strurl")};

               ObjectHandle handle = Activator.CreateInstance("Remotenamesapce", "Remotenamesapce.RObjectClass", attrs);

               RObjectClass obj = (RObjectClass)handle.Unwrap();

               // 其中Remotenamesapce为命名空间名字,也为程序集名称。

               方法二:使用new ,例如:

               RemotingConfiguration.RegisterActivatedClientType(typeof(RObjectClass), "tcp://localhost:8085/strurl");

               RObjectClass obj = new RObjectClass();

     5. 在客户端经过第4步获得远程对象(实际是一个透明代理对象)后客户端可以像使用本地对象一样使用远程对象了。

  • 相关阅读:
    函数式编程理解
    Java8 lambda表达式10个示例
    MD5进行文件完整性校验的操作方法
    加密算法和MD5等散列算法的区别(转)
    随笔
    瑕疵(bug)严重性定义
    无需Cygwin,如果没有在命令行,Eclipse编NDK
    BZOJ 1878 SDOI 2009 HH项链 树状数组 + 脱机处理
    Teamcity+SVN+VisualStudio在持续集成简明教程
    UVALive3713-Astronauts(2-SAT)
  • 原文地址:https://www.cnblogs.com/sunleinote/p/3091200.html
Copyright © 2011-2022 走看看