




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专栏作品创建以Microsoft .NET Remoting为基础的分布式应用架构卢彦引言在论坛里经常看见有人问:使用.NET Remoting如何从服务器主动发出事件通知客户端?的确,初接触.NET Remoting的人多半会有这样的疑问,因为大部分的文章和书籍在介绍.NET Remoting时都只介绍了通道,对象,激活和生存周期等等概念,在谈到如何进行远程通信的时候,都只告诉读者如何从客户端激活一个服务器对象然后传递 参数调用其方法。所以很多读者都不太清楚如何从服务器向客户端广播信息,甚至有很多人认为跟WEB服务器不能主动发送信息到浏览器一样,.NET Remoting同样也不能这么做,只能采用客户端发出请求-服务器回复响应这种简单的通讯模式,以至于在需要服务器对客户端广播信息时设计 出两端都放上Server和Client对象的复杂架构,既麻烦又容易出错。其实.NET Remoting远程处理完全支持事件驱动的编程和使用同步和异步委托的回调函数。在.NET Remoting中你可以方便的采用事件注册远程回调函数,并方便的利用这种机制将服务器端信息广播到客户端。下面将向读者详细介绍这种分布式多点广播应 用程序架构的编写方法。网络物理结构图上面便是网络结构示意图,之所以说它是一个典型的分布式应用架构是因为基于这种网络结构十分常见,在证券交易,期货行情,视频会议,远程教学等许多方面都能派上用场。架构设计为了形象化抽象的概念,我们先来了解一下电视广播的工作流程,再结合我们的程序理解架构设计的主要思想。电视广播的流程是由以下四个主要机构参与其中:1. 节目制作部门。负责制作电视节目。2. 转播间。负责安排节目制作部门提供的节目的广播方式。3. 电视塔。负责将电视信号转化为无线电波发送出去。4. 电视机。负责接受无线电信号并转换成可视的图象。在我们的程序中也是由四个主要的对象组成,它们的名称和用途分别是:1. Announcer:信息发送对象。负责发送原始信息,相当于电视节目制作部门。2. InfoCenter: 信息中心。负责管理信息广播机制。相当于转播间。3. Server:服务器。管理传送通道,负责发送广播数据流。相当于电视塔。4. Receiver:接受器。接受广播数据流,转换成我们可以理解的信息格式。相当于电视机。对象结构如下图所示:程序设计首先我们来看一下信息中心InfoCenter对象的编写方法(InfoCenter.cs):using System;using System.Runtime.Remoting;namespace Distribution_Framework/定义广播事件的参数类Serializablepublic class BroadcastEventArgs : EventArgsprivate string msg = null;public BroadcastEventArgs(string message)msg = message;public string Messagegetreturn msg;public delegate void BroadcastEventHandler(object sender, BroadcastEventArgs submitArgs);public class InfoCenter : MarshalByRefObjectpublic InfoCenter()Console.WriteLine(InfoCenter created.);public override object InitializeLifetimeService()return null;public event BroadcastEventHandler Broadcaster;public void Broadcasting(string message)BroadcastEventArgs e = new BroadcastEventArgs(message);if (Broadcaster != null)Broadcaster(this, e);/发出事件Console.WriteLine(Broadcast: + e.Message);要点说明:public delegate void BroadcastEventHandler(object sender, BroadcastEventArgs submitArgs);定义了一个事件处理委托及其参数格式。public event BroadcastEventHandler Broadcaster;请注意,这一句定义了一个公共事件,需要接受广播信息的远程对象可以通过这个事件向InfoCenter注册使用BroadcastEventHandler委托的远程回调函数。这个机制有点类似有线受费电视,你如果需要收看电视台提供的电视节目请先来登记。接下来看看Server对象的实现(Server.cs):using System;using System.Runtime.Remoting;namespace Distribution_Frameworkclass Serverpublic static void Main(string Args)RemotingConfiguration.Configure(Server.exe.config);Console.WriteLine(Server is running, Press Enter key to exit.);Console.ReadLine();呵呵,是不是跟电视塔一样简单?基本上除了天线就没别的了。 :)下面是它的配置文件(Server.exe.config): 电视广播站已经架设好了,我们再来看看电视机是怎么做的(Receiver.cs):using System;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Http;namespace Distribution_Frameworkclass Receiver : MarshalByRefObjectInfoCenter infoCenter;public Receiver()public override object InitializeLifetimeService() return null;public void Run()RemotingConfiguration.Configure(Receiver.exe.config);infoCenter = new InfoCenter();/订阅信息infoCenter.Broadcaster += new BroadcastEventHandler(this.BroadcastReceiver);Console.WriteLine(Ready to Recieve Message.);Console.ReadLine();/取消订阅infoCenter.Broadcaster -= new BroadcastEventHandler(this.BroadcastReceiver);public void BroadcastReceiver(object sender, BroadcastEventArgs args)Console.WriteLine(Received: + args.Message);/打印接收信息public static void Main()Receiver receiver = new Receiver();receiver.Run();要点说明:infoCenter.Broadcaster += new BroadcastEventHandler(this.BroadcastReceiver);还记得我们在InfoCenter中定义的那个Broadcaster事件吗?这里就是 如何向它注册一个远程回调函数,相当于登记收看电视节目了。不想看了的话记得要向它取消登记哦,infoCenter.Broadcaster -= new BroadcastEventHandler(this.BroadcastReceiver);不然多收了你的钱可别耍赖。 :)public void BroadcastReceiver(object sender, BroadcastEventArgs args)Console.WriteLine(Received: + args.Message);这个就是被服务器端远程回调的函数。另外要注意的是,这个客户对象也必须要从MarshalByRefObject继承,原因很简单,因为它相对于服务器来说也是一个需要进行序列化调用的远程对象。下面是它的配置文件(Receiver.exe.config): 请注意,port=0表示由计算机自动选取一个最合适的端口。我们现在电视机也有了,就差有人来送节目播放了,下面就是电视节目制作部的代码(Announcer.cs):using System;using System.Timers;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Http;namespace Distribution_Frameworkclass AnnouncerInfoCenter infoCenter;public static void Main(string Args)Announcer announcer = new Announcer();announcer.Run();Console.WriteLine(The announcer has been started.);Console.ReadLine();public void Run()RemotingConfiguration.Configure(Announcer.exe.config);infoCenter = new InfoCenter();Timer timer = new Timer(1000);timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);timer.Enabled = true;private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)string msg = The Time is: + DateTime.Now.ToString();Console.WriteLine(Send Message: + msg);infoCenter.Broadcasting(msg);在这里,我们定义了一个定时器,每隔一秒种便向服务器发送一个计算机本地时间字符串信 息,我们终于有可以收到的节目了,虽然是简单了点。另外,请注意,就象我们可以接收很多电视频道一样,发送者并没有规定只能有一个,事实上我们的确可以添 加许多发送者,不过要注意线程之间的同步问题。下面是它的配置文件(Announcer.exe.config): 眼明的读者一下就看出来了,这个跟Receiver的配置文件一模一样,其实它们本来就都是客户端,配置文件当然是一样的。最后,我们用下列命令将它们编译成可执行文件:csc /t:library infocenter.cscsc /r:infocenter.dll server.cscsc /r:infocenter.dll receiver.cscsc /r:infocenter.dll announcer.cs请先运行Server.exe然后再运行Announcer.exe,最后你可以多打开 几个Receiver,观察它们的工作情况。注意,如果你需要在不同的计算机上向别人演示这个程序的话,请将配置文件中的localhost改成相应的计 算机名称或者是IP地址,而无须重新编译。总结使 用.NET编程总是这么简单和有趣,在上例中,你几乎看不到什么关于远程的特
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高港叉车考试题库及答案
- 广告合同模板(3篇)
- 2025年新能源汽车技术创新与新能源汽车充电网络运营模式研究报告
- 2025年新能源汽车自动驾驶法规制定与实施效果评估报告
- 工业废气深度净化技术在冶金辅料行业应用现状与发展前景报告
- 2025年执业药师考试题库及答案
- 关于开展2025年职业病防治法宣传周的通知
- 2025年委托贷款借款合同样本
- 光纤光缆制造工节假日后复工安全考核试卷含答案
- 2025年煤矿防突考试题及答案
- 部编版小学一年级上册语文带拼音阅读练习题26篇
- 无机及分析化学第2章-化学热力学基础1
- GB/T 2930.1-2017草种子检验规程扦样
- 会计学原理模拟试题一套
- 第一章-宗教社会学的发展和主要理论范式课件
- 国内外新能源现状及发展趋势课件
- 临床常见护理技术操作常见并发症的预防与处理课件
- 高速公路改扩建桥梁拼宽施工技术及质量控制
- 双台110kV主变短路电流计算书
- 你不懂咖啡课件
- 危险物品储存安全隐患排查整治表
评论
0/150
提交评论