.NET Remoting学习笔记(二)激活方式

目录

参考:百度百科  ♂风车车.Net

激活方式概念

在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象,称为对象的激活。

激活分为两大类:服务器端激活  客户端激活

服务器端激活

又称WellKnow(知名对象)

服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象,并根据指定的端口或地址来发布对象。

服务器端激活分为:SingleTon模式  SingleCall模式

SingleTon模式

设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时, SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。如果熟悉Asp .Net的状态管理,我们可以认为它是一种Application状态。

下面贴代码:

1.创建远程调用处理的类

using System;
using System.Runtime.Remoting.Metadata;

/*code 释迦苦僧*/
namespace MessageMarshal
{
    /*创建发送消息委托*/
    public delegate void SendMessageHandler(string messge);
    [Serializable]
    public class TestMessageMarshal : MarshalByRefObject
    {
        private Guid ID { get; set; }
        /*新建对象实例时重新创建标识编号*/
        public TestMessageMarshal()
        {
            ID = Guid.NewGuid();
        }

        /*创建发送消息事件*/
        public static event SendMessageHandler SendMessageEvent;

        /*发送消息*/
        [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")]
        public void SendMessage(string messge)
        {
            if (SendMessageEvent != null)
                SendMessageEvent(ID.ToString() + "\t" + messge);
        }
    }
}

2.创建服务端代码

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using MessageMarshal;

namespace TestRemotingServer
{
    /*code:释迦苦僧*/
    class Program
    {
        static void Main(string[] args)
        {
            /*创建HTTP通道*/
            HttpChannel channel = new HttpChannel(8226);

            /*注册通道服务端*/
            ChannelServices.RegisterChannel(channel,false);
            /*设置模式为 Singleton */
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(TestMessageMarshal),"test", WellKnownObjectMode.Singleton);
            Console.WriteLine("started ...");
            /*接收客户端事件*/
            TestMessageMarshal.SendMessageEvent+=new SendMessageHandler(TestMessageMarshal_SendMessageEvent);
            Console.Read();
        }

        static void TestMessageMarshal_SendMessageEvent(string messge)
        {
            Console.WriteLine(messge);
        }
    }
}

3.创建客户端代码

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Threading;

/*code 释迦苦僧*/
namespace TestRemotingClient
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpChannel channel = new HttpChannel();
            ChannelServices.RegisterChannel(channel, false);
            /*注册通道 的 远程处理类型*/
            RemotingConfiguration.RegisterWellKnownClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:8226/test");
            /*创建消息实体*/
            MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();
            while (true)
            {
                TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
                Console.WriteLine("send message...");
                Thread.Sleep(2000);
            }
        }
    }
}

4.运行服务端后,开启两个客户端程序,查看结果如下:

代码示意中,当TestMessageMarshal有新实例时,其构造函数会创建不同的标识(GUID),服务端接收到客户端的数据请求,并将标识编号输出到界面,从界面中可以看出,多个客户端请求的通道,服务端都是用一个通道(一个实例)来进行处理的。

SingleCall模式

SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时, Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp .Net的状态管理,认为它是一种Session状态。

我们修改服务端代码如下,客户端不需要修改:

            /*设置模式为 SingleCall */
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(TestMessageMarshal),"test", WellKnownObjectMode.SingleCall);   

开启服务端,然后开启一个客户端,如下

从输出结果中可以看出,每次服务端都会为每一个客户端请求建立一个远程对象实例。

客户端激活

与WellKnown模式不同, Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由 GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。

1.修改服务端代码

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels.Tcp;
using MessageMarshal;

namespace TestRemotingServer
{
    /*code:释迦苦僧*/
    class Program
    {
        static void Main(string[] args)
        {
            /*创建HTTP通道*/
            HttpChannel channel = new HttpChannel(8226);

            /*注册通道服务端*/
            ChannelServices.RegisterChannel(channel,false);
            RemotingConfiguration.ApplicationName = "test";
            RemotingConfiguration.RegisterActivatedServiceType(typeof(TestMessageMarshal));
            Console.WriteLine("started ...");
            /*接收客户端事件*/
            TestMessageMarshal.SendMessageEvent+=new SendMessageHandler(TestMessageMarshal_SendMessageEvent);
            Console.Read();
        }

        static void TestMessageMarshal_SendMessageEvent(string messge)
        {
            Console.WriteLine(messge);
        }
    }
}

2.修改客户端代码

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Threading;

/*code 释迦苦僧*/
namespace TestRemotingClient
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpChannel channel = new HttpChannel();
            ChannelServices.RegisterChannel(channel, false);
            /*注册通道 的 远程处理类型*/
            RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:8226/test");
            /*创建消息实体*/
            MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal();
            while (true)
            {
                TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString());
                Console.WriteLine("send message...");
                Thread.Sleep(2000);
            }
        }
    }
}

3.测试,开启服务端和两个客户端

可以看出每个服务端为每个客户端都会创建一个实例对象。

其测试目录结构如下,不然客户端远程对象和服务端会不对应。会报“找不到请求的服务”的异常

这就是 Remoting 的三种 激活方式,如有问题欢迎指正。

作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3995366.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-08-07 08:22:36

.NET Remoting学习笔记(二)激活方式的相关文章

.NET Remoting学习笔记(三)信道

目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework 远程处理基础结构提供下列信道实现: IpcChannel TcpChannel HttpChannel IpcChannel IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 进程间通信 (IPC) 系统在同一计算机上的应用程序域之间传输消息.在同一计

.NET Remoting学习笔记(一)概念

目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remoting,但是对他了解少之又少,近日有点时间,参考研究研究. 其相关概念本章不做详解,具体大家可以看下  http://baike.baidu.com/view/742675.htm?fr=aladdin  ,写的很详细. .Net Remoting概念 概念:一种分布式处理方式.从微软的产品角度来看,可

【转载】.NET Remoting学习笔记(一)概念

目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remoting,但是对他了解少之又少,近日有点时间,参考研究研究. 其相关概念本章不做详解,具体大家可以看下  http://baike.baidu.com/view/742675.htm?fr=aladdin  ,写的很详细. .Net Remoting概念 概念:一种分布式处理方式.从微软的产品角度来看,可

【转载】.NET Remoting学习笔记(三)信道

目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework 远程处理基础结构提供下列信道实现: IpcChannel TcpChannel HttpChannel IpcChannel IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 进程间通信 (IPC) 系统在同一计算机上的应用程序域之间传输消息.在同一计

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

angularjs 学习笔记(二) ----- bootstrap框架

1.  下载新的jquery-1.11.1文件. 2.  下载新的bootstrap文件. 3.  选择流式布局的模板填充入index.html文件. 4.  将top.foot转为nginclude文件 nginclude必须使用$scope对象,因此需要设置一个全局的mainctrl来将字符串或全局变量注入$cope中. $rootScope.global =global; 直接将全局变量global赋值给$rootScope,并且之后的子$Scope会获得继承,静态定义与ctrl分开. 5

AJax 学习笔记二(onreadystatechange的作用)

AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的做法.onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如: 复制代码 代码如下: ajaxObj=createAjaxObject(); var url="/MyTod

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It