• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > Microsoft .Net Remoting系列教程之三:Remoting事件处理全接触

Microsoft .Net Remoting系列教程之三:Remoting事件处理全接触

作者:张逸 字体:[增加 减小] 来源:互联网 时间:2017-05-11

张逸通过本文主要向大家介绍了.net remoting 教程,.net remoting,.net remoting 实例,remoting,remoting信道异常等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

  前言:在Remoting中处理事件其实并不复杂,但其中有些技巧需要你去挖掘出来。正是这些技巧,仿佛森严的壁垒,让许多人望而生畏,或者是不知所谓,最后放弃了事件在Remoting的使用。关于这个主题,在网上也有很多讨论,相关的技术文章也不少,遗憾的是,很多文章概述的都不太全面。我在研究Remoting的时候,也对事件处理发生了兴趣。经过参考相关的书籍、文档,并经过反复的试验,深信自己能够把这个问题阐述清楚了。

  本文对于Remoting和事件的基础知识不再介绍,有兴趣的可以看我的系列文章,或查阅相关的技术文档。

本文示例代码下载:

Remoting事件(客户端发传真)

Remoting事件(服务端广播)

Remoting事件(服务端广播改进)

  应用Remoting技术的分布式处理程序,通常包括三部分:远程对象、服务端、客户端。因此从事件的方向上看,就应该有三种形式:

1、服务端订阅客户端事件
2、客户端订阅服务端事件
3、客户端订阅客户端事件

  服务端订阅客户端事件,即由客户端发送消息,服务端捕捉该消息,然后响应该事件,相当于下级向上级发传真。反过来,客户端订阅服务端事件,则是由服务端发送消息,此时,所有客户端均捕获该消息,激发事件,相当于是一个系统广播。而客户端订阅客户端事件呢?就类似于聊天了。由某个客户端发出消息,其他客户端捕获该消息,激发事件。可惜的是,我并没有找到私聊的解决办法。当客户端发出消息后,只要订阅了该事件的,都会获得该信息。

  然而不管是哪一种方式,究其实质,真正包含事件的还是远程对象。原理很简单,我们想一想,在Remoting中,客户端和服务端传递的内容是什么呢?毋庸置疑,是远程对象。因此,我们传递的事件消息,自然是被远程对象所包裹。这就像EMS快递,远程对象是运送信件的汽车,而事件消息就是汽车所装载的信件。至于事件传递的方向,只是发送者和订阅者的角色发生了改变而已。

一、 服务端订阅客户端事件

  服务端订阅客户端事件,相对比较简单。我们就以发传真为例。首先,我们必须具备传真机和要传真的文件,这就好比我们的远程对象。而且这个传真机上必须具备“发送”的操作按钮。这就好比是远程对象中的一个委托。当客户发送传真时,就需要在客户端上激活一个发送消息的方法,这就好比我们按了“发送”按钮。消息发送到服务端后,触发事件,这个事件正是服务端订阅的。服务端获得该事件消息后,再处理相关业务。这就好比接收传真的人员,当传真收到后,会听到接通的声音,此时选择“接收”后,该消息就被捕获了。

现在,我们就来模拟这个流程。首先定义远程对象,这个对象处理的应该是一个发送传真的业务:
首先是远程对象的公共接口(Common.dll):

public delegate void FaxEventHandler(string fax);
public interface IFaxBusiness
{
 void SendFax(string fax);
}
</div>

注意,在公共接口程序集中,定义了一个公共委托。

然后我们定义具体处理传真业务的远程对象类(FaxBusiness.dll),在这个类中,先要添加对公共接口程序集的引用:

public class FaxBusiness:MarshalByRefObject,IFaxBusiness
{ 
 public static event FaxEventHandler FaxSendedEvent;

 #region

 public void SendFax(string fax)
 {
 if (FaxSendedEvent != null)
 {
 FaxSendedEvent(fax);
 }
 }

 #endregion

 public override object InitializeLifetimeService()
 {
 return null;
 }
}

</div>

  这个远程对象中,事件的类型就是我们在公共程序集Common.dll中定义的委托类型。SendFax实现了接口IFaxBusiness中的方法。这个方法的签名和定义的委托一致,它调用了事件FaxSendedEvent。
特殊的地方是我们定义的远程对象最好是重写MarshalByRefObject类的InitializeLifetimeService()方法。返回null值表明这个远程对象的生命周期为无限大。为什么要重写该方法呢?道理不言自明,如果生命周期不进行限制的话,一旦远程对象的生命周期结束,事件就无法激活了。
接下来就是分别实现客户端和服务端了。服务端是一个Windows应用程序,界面如下:

http://files.weikejianghu.com/file_images/article/201605/201605301033455.gif

我们在加载窗体的时候,注册通道和远程对象:

private void ServerForm_Load(object sender, System.EventArgs e)
{
 HttpChannel channel = new HttpChannel(8080);
 ChannelServices.RegisterChannel(channel);

 RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(FaxBusiness),"FaxBusiness.soap",WellKnownObjectMode.Singleton);
 FaxBusiness.FaxSendedEvent += new FaxEventHandler(OnFaxSended);
}
</div>

  我们采用的是SingleTon模式,注册了一个远程对象。注意看,这段代码和一般的Remoting服务端有什么区别?对了,它多了一行注册事件的代码:

FaxBusiness.FaxSendedEvent += new FaxEventHandler(OnFaxSended);
</div>

这行代码,就好比我们服务端的传真机,一直切换为“自动”模式。它会一直监听着来自客户端的传真信息,一旦传真信息从客户端发过来了,则响应事件方法,即OnFaxSended方法:

public void OnFaxSended(string fax)
{
 txtFax.Text += fax;
 txtFax.Text += System.Environment.NewLine;
}
</div>

这个方法很简单,就是把客户端发过来的Fax显示到txtFax文本框控件上。

而客户端呢?仍然是一个Windows应用程序。代码非常简单,首先为了简便其见,我们仍然让它在装载窗体的时候,激活远程对象:

private void ClientForm_Load(object sender, System.EventArgs e)
{
 HttpChannel channel = new HttpChannel(0);
 ChannelServices.RegisterChannel(channel);

 faxBus = (IFaxBusiness)Activator.GetObject(typeof(IFaxBusiness),
 "http://localhost:8080/FaxBusiness.soap");
}

</div>

呵呵,可以说客户端激活对象的方法和普通的Remoting客户端应用程序没有什么不同。该写传真了!我们在窗体上放一个文本框对象,改其Multiline属性为true。再放一个按钮,负责发送传真:

private void btnSend_Click(object sender, System.EventArgs e)
{
 if (txtFax.Text != String.Empty)
 {
 string fax = "来自" + GetIpAddress() + "客户端的传真:"
 + System.Environment.NewLine;
 fax += txtFax.Text;
 faxBus.SendFax(fax);
 }
 else
 {
 MessageBox.Show("请输入传真内容!");
 }
}

private string GetIpAddress()
{ 
 IPHostEntry ipHE = Dns.GetHostByName(Dns.GetHostName());
 return ipHE.AddressList[0].ToString(); 
}

</div>

  在这个按钮单击事件中,只需要调用远程对象faxBus的SendFax()方法就OK了,非常简单。可是慢着,为什么你的代码有这么多行啊?其实,没有什么奇怪的,我只是想到发传真的客户可能会很多。为了避免服务端人员犯糊涂,搞不清楚是谁发的,所以要求在传真上加上各自的签名,也就是客户端的IP地址了。既然要获得计算机的IP地址,请一定要记得加上对DNS的命名空间引用:
using System.Net;

  因为我们严格按照分布式处理程序的部署方式,所以在客户端只需要添加公共程序集(Common.dll)的引用就可以了。而在服务端呢,则必须添加公共程序集和远程对象程序集两者的引用。

OK,程序完成,我们来看看这个简陋的传真机:
客户端:

http://files.weikejianghu.com/file_images/article/201605/201605301033456.gif

嘿嘿,做梦都想放假啊。好的,传真写好了,发送吧!再看看服务端,great,老板已经收到我的请假条传真了!

http://files.weikejianghu.com/file_images/article/201605/201605301033457.gif

二、 客户端订阅服务端事件

  嘿嘿,吃甘蔗要先吃甜的一段,做事情我也喜欢先做容易的。现在,好日子过去了,该吃点苦头了。我们先回忆一下刚才的实现方法,再来思考怎么实现客户端订阅

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Microsoft .Net Remoting系列教程之三:Remoting事件处理全接触
  • Microsoft .Net Remoting系列教程之一:.Net Remoting基础篇

相关文章

  • 2017-05-11Asp.net的服务器推技术 (Server Push)
  • 2017-05-11web.config中配置数据库连接的方式
  • 2018-08-20Visual Studio 2015 配置 Opencv3.2的图文详解
  • 2017-05-11状态保存机制之ViewState概述及应用
  • 2017-05-11详解mvc使用JsonResult返回Json数据
  • 2017-05-11asp.net dataview做无限极分类的又一用法
  • 2017-05-11asp.net小谈网站性能优化
  • 2017-05-11asp.net core mvc实现文件上传实例
  • 2017-05-11asp.net 将一个图片以二进制值的形式存入Xml文件中的实例代码
  • 2017-05-11asp.net得到本地电脑基本信息的简单方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs
    • 使用jQuery Uploader显示文件上传进度
    • asp.net 数据库的连接和datatable类
    • Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块完美实现
    • FileUpload 控件禁止手动输入的方法
    • 使用ASP.NET 2.0 CSS 控件适配器生成CSS友好的HTML输出
    • 防止在服务器处理完成之前用户多次点击提交按钮处理代码
    • asp.net实现图片以二进制流输出的两种方法
    • asp.net 控件验证 FCKeditor
    • c#实现根据网络IP显示地理位置功能示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有