美文网首页
.NET Remoting 学习

.NET Remoting 学习

作者: 鲁先森L | 来源:发表于2019-01-08 13:19 被阅读7次

    1月8日 周二 阴云密布

    听说明天是暴雪,这真是个不幸的消息。
    算了,该来的总得来。不如老老实实的工作,应该说是踏踏实实的学习,哈哈。总觉得这样的环境有些安逸,让人提不起来斗志。但是工作的时间总该是专心致志的,这点倒还是不赖。可是下班后的时间,总是觉得颓废。心里一直有股热流,呼之欲出。可能会是下个转折点吧,莫名期待。
    这日记写着写着会不会让人越发感性,细思恐极!我还是记录点学习进度吧~~

    .NET Remoting

    什么是 Remoting,简而言之,我们可以将其看作是一种分布式处理方式。 .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。在 Remoting 中是通过通道(channel)来实现两个应用程序域之间对象的通信的。

    实现步骤

    [服务端]

    1. 注册通道

    要跨越应用程序域进行通信,必须实现通道。如前所述,Remoting 提供了 IChannel 接
    口,分别包含 TcpChannel 和 HttpChannel 两种类型的通道。这两种类型除了性能和序列化数
    据的格式不同外,实现的方式完全一致,因此下面我们就以 TcpChannel 为例。

    注册 TcpChannel,首先要在项目中添加引用“System.Runtime.Remoting”,然后 using
    名字空间:System.Runtime.Remoting.Channel.Tcp。代码如下:

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

    在实例化通道对象时,将端口号作为参数传递。然后再调用静态方法 RegisterChannel()来注
    册该通道对象即可。

    2.注册远程对象

    注册了通道后,要能激活远程对象,必须在通道中注册该对象。根据激活模式的不同,
    注册对象的方法也不同。
    1) SingleTon 模式
    对于 WellKnown 对象,可以通过静态方法
    RemotingConfiguration.RegisterWellKnownServiceType()来实现:

    RemotingConfiguration.RegisterWellKnownServiceType(
    typeof(ServerRemoteObject.ServerObject),
    "ServiceMessage",WellKnownObjectMode.SingleTon); 
    

    2)SingleCall 模式
    注册对象的方法基本上和 SingleTon 模式相同,只需要将枚举参数
    WellKnownObjectMode 改为 SingleCall 就可以了。

    RemotingConfiguration.RegisterWellKnownServiceType(
     typeof(ServerRemoteObject.ServerObject),
     "ServiceMessage",WellKnownObjectMode.SingleCall); 
    

    3)客户端激活模式
    对于客户端激活模式,使用的方法又有不同,但区别不大,看了代码就一目了然。

    RemotingConfiguration.ApplicationName = "ServiceMessage";
    RemotingConfiguration.RegisterActivatedServiceType(
     typeof(ServerRemoteObject.ServerObject)); 
    
    3.注销通道

    如果要关闭 Remoting 的服务,则需要注销通道,也可以关闭对通道的监听。在 Remoting
    中当我们注册通道的时候,就自动开启了通道的监听。而如果关闭了对通道的监听,则该通
    道就无法接受客户端的请求,但通道仍然存在,如果你想再一次注册该通道,会抛出异常。

    //获得当前已注册的通道;
    IChannel[] channels = ChannelServices.RegisteredChannels;
    //关闭指定名为 MyTcp 的通道;
    foreach (IChannel eachChannel in channels)
    {
     if (eachChannel.ChannelName == "MyTcp")
     {
     TcpChannel tcpChannel = (TcpChannel)eachChannel;
     //关闭监听;
     tcpChannel.StopListening(null);
     //注销通道;
     ChannelServices.UnregisterChannel(tcpChannel);
     }
    }
    

    [客户端]

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

    1.注册通道
    TcpChannel channel = new TcpChannel();
    ChannelServices.RegisterChannel(channel); 
    

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

    2. 获取远程对象

    (1)WellKnown 激活模式

    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);
    b、public static ObjectHandle CreateInstance(string assemblyName, string typeName,
    object[] activationAttribute); 
    

    补充

    通过上面的描述,基本上已经完成了一个最简单的 Remoting 程序。这是一个标准的创建 Remoting 程序的方法,但在实际开发过程中,我们遇到的情况也许千奇百怪,如果只掌握一种所谓的“标准”,就妄想可以“一招鲜、吃遍天”,是不可能的。

    注:本文参考:http://www.cnblogs.com/xia520pi/ 虾皮工作室,仅供学习,请勿转载!

    相关文章

      网友评论

          本文标题:.NET Remoting 学习

          本文链接:https://www.haomeiwen.com/subject/fpjvrqtx.html