.NET Remoting学习笔记(二)激活方式
目录
- .NET Remoting学习笔记(一)概念
- .NET Remoting学习笔记(二)激活方式
- .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);}} }
View Code
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);}} }
View Code
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);}}} }
View Code
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);}} }
View Code
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);}}} }
View Code
3.测试,开启服务端和两个客户端
可以看出每个服务端为每个客户端都会创建一个实例对象。
其测试目录结构如下,不然客户端远程对象和服务端会不对应。会报“找不到请求的服务”的异常
这就是 Remoting 的三种 激活方式,如有问题欢迎指正。
作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3995366.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
.NET Remoting学习笔记(二)激活方式相关推荐
- Ethernet/IP 学习笔记二
Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...
- Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用
Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用 大概要写到结尾了,最后几篇就将手册的各常用命令再看一遍,组合一下,并列举出常见的一些有用的操作. DATA_COLOR_MAP数 ...
- Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )
Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- Java学习笔记二:数据类型
Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...
- ASP.NET MVC 2 学习笔记二: 表单的灵活提交
ASP.NET MVC 2 学习笔记二: 表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- MATLAB学习笔记——二维和三维绘图
MATLAB学习笔记--二维和三维绘图 近期练习matlab的二维和三维绘图,整理一下,以防忘记. 文章目录 MATLAB学习笔记--二维和三维绘图 一.二维绘图 1.plot命令 2.fplot 命 ...
- ROS学习笔记二:探索ROS文件系统
ROS学习笔记二:探索ROS文件系统 ROS针对自己文件的特性,具有一些自己的工具命令,当针对ROS文件进行操作的时候是非常方便的.这些命令和ubuntu系统原有的命令相似但却不同,单独针对ROS文件 ...
最新文章
- Java源码详解五:ArrayList源码分析--openjdk java 11源码
- python编程基础与应用-Python编程基础与应用
- RDD(弹性分布式数据集)
- Java加密与解密的艺术~安全协议~单向认证服务
- 探索未知种族之osg类生物---器官初始化一
- DirectAdmin安装mod_encoding支持中文
- Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法
- 软件架构领域集大成者——《架构之美》读书笔记
- npm安装依赖报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\misal\AppData\R
- nexus 启动报错 The nexus service was launched, but failed to start
- 电脑运行卡或软件卡死无响应,怎么办?
- random.shuffle(lst)
- SAP 采购订单入库——移动类型
- @Value注解获取不到配置值
- Writing a code for speed tracking control of maglev trains in MATLAB using reinforcement learning
- xp下对dinput8.dll 游戏键盘输入的模拟 非函数hook
- 清除浮动最有效的css写法,清除浮动最有效的css写法
- 教师计算机课游戏教学设计,《有趣的游戏》教学设计5篇
- HackTheBox::Admirer
- “3年内不会买车!”业内人揭秘真实汽车行业内幕
热门文章
- Apache Flink Meetup · 北京站,1.13 新版本 x 互娱实践分享的开发者盛筵!
- Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)
- PKU 3468 A Simple Problem with Integers
- java文件上传中间件_maven工程 java 实现文件上传 SSM ajax异步请求上传
- Scala学习07——隐式转换
- j2ee 现在已经改名为java ee_Java EE 已经正式更名为 Jakarta EE(雅加达)
- python怎么打出pi_随手写了段 Python,微信的地球居然转起来
- golang,break跳出循环的例子以及随机数生成
- ping,python实现批量ping包工具--小案例v5阶段版本,可以使用了
- 简单的php cms,30个很棒的PHP开源CMS内容管理系统