客户端:

public class ServerObject:MarshalByRefObject
{
 public ServerObj()
 {
  throw new System.NotImplementedException();
 }

 public Person GetPersonInfo(string name,string sex,int age)
 {
  throw new System.NotImplementedException();
 }
}

  比较客户端和服务器端,客户端的方法GetPersonInfo(),没有具体的实现细节,只是抛出了一个异常。或者直接写上语句return null,照样OK。我们称客户端的这个类为远程对象的替代类。

  3、利用配置文件实现

  前面所述的方法,于服务器uri、端口、以及激活模式的设置是用代码来完成的。其实我们也可以用配置文件来设置。这样做有个好处,因为这个配置文件是Xml文档。如果需要改变端口或其他,我们就不需要修改程序,并重新编译,而是只需要改变这个配置文件即可。 (1) 服务器端的配置文件:

<configuration>
<system.runtime.remoting>
<application name="ServerRemoting">
<service>
<wellknown mode="Singleton" type="ServerRemoteObject.ServerObject" objectUri="ServiceMessage"/>
</service>
<channels>
<channel ref="tcp" port="8080"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>

  如果是客户端激活模式,则把wellknown改为activated,同时删除mode属性。

  把该配置文件放到服务器程序的应用程序文件夹中,命名为ServerRemoting.config。那么前面的服务器端程序直接用这条语句即可:
RemotingConfiguration.Configure("ServerRemoting.config");

  (2) 客户端配置文件

  如果是客户端激活模式,修改和上面一样。调用也是使用RemotingConfiguration.Configure()方法来调用存储在客户端的配置文件。

  配置文件还可以放在machine.config中。如果客户端程序是web应用程序,则可以放在web.config中。

  4、启动/关闭指定远程对象

  Remoting中没有提供类似UnregisterWellKnownServiceType()的方法,也即是说,一旦通过注册了远程对象,如果没有关闭通道的话,该对象就一直存在于通道中。只要客户端激活该对象,就会创建对象实例。如果Remoting传送的只有一个远程对象,这不存在问题,关闭通道就可以了。如果传送多个远程对象呢?要关闭指定的远程对象应该怎么做?关闭之后又需要启动又该如何?

  我们注意到在Remoting中提供了Marshal()和Disconnect()方法,答案就在这里。Marshal()方法是将MarshalByRefObject类对象转化为ObjRef类对象,这个对象是存储生成代理以与远程对象通讯所需的所有相关信息。这样就可以将该实例序列化以便在应用程序域之间以及通过网络进行传输,客户端就可以调用了。而Disconnect()方法则将具体的实例对象从通道中断开。

  方法如下:

  首先注册通道:

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

  接着启动服务:

  先在服务器端实例化远程对象。

ServerObject obj = new ServerObject();

然后,注册该对象。注意这里不用RemotingConfiguration.RegisterWellKnownServiceType(),而是使用RemotingServices.Marshal():

ObjRef objrefWellKnown = RemotingServices.Marshal(obj, "ServiceMessage");

  如果要注销对象,则:

RemotingServices.Disconnect(obj);

  要注意,这里Disconnect的类对象必须是前面实例化的对象。正因为此,我们可以根据需要创建指定的远程对象,而关闭时,则Disconnect之前实例化的对象。

  至于客户端的调用,和前面WellKnown模式的方法相同,仍然是通过Activator.GetObject()来获得。但从实现代码来看,我们会注意到一个问题,由于服务器端是显式的实例化了远程对象,因此不管客户端有多少,是否相同,它们调用的都是同一个远程对象。因此我们将这个方法称为模拟的SingleTon模式。

  客户端激活模式

  我们也可以通过Marshal()和Disconnect()来模拟客户端激活模式。首先我们来回顾“远程对象元数据相关性”一节,在这一节中,我说到采用设计模式的“抽象工厂”来创建对象实例,以此用SingleCall模式来模拟客户端激活模式。在仔细想想前面的模拟的SingleTon模式。是不是答案就将呼之欲出呢?

  在“模拟的SingleTon”模式中,我们是将具体的远程对象实例进行Marshal,以此让客户端获得该对象的引用信息。那么我们换一种思路,当我们用抽象工厂提供接口,工厂类实现创建远程对象的方法。然后我们在服务器端创建工厂类实例。再将这个工厂类实例进行Marshal。而客户端获取对象时,不是获取具体的远程对象,而是获取具体的工厂类对象。然后再调用CreateInstance()方法来创建具体的远程对象实例。此时,对于多个客户端而言,调用的是同一个工厂类对象;然而远程对象是在各个客户端自己创建的,因此对于远程对象而言,则是由客户端激活,创建的是不同对象了。

  当我们要启动/关闭指定对象时,只需要用Disconnet()方法来注销工厂类对象就可以了。

  六、小结
  
  Microsoft.Net Remoting真可以说是博大精深。整个Remoting的内容不是我这一篇小文所能尽述的,更不是我这个Remoting的初学者所能掌握的。王国维在《人间词话》一书中写到:古今之成大事业大学问者,必经过三种境界。“昨夜西风凋碧树,独上高楼,望尽天涯路。”此第一境界也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境界也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境界也。如以此来形容我对Remoting的学习,还处于“独上高楼,望尽天涯路”的时候,真可以说还未曾登堂入室。

  或许需得“衣带渐宽”,学得Remoting“终不悔”,方才可以“蓦然回首”吧。

.NET Remoting程序开发入门篇(五)相关推荐

  1. 微信小程序开发入门篇

    本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果. 开发准备工作 获取微信小程序的 AppID 登录 https://mp.weixin.qq.com ,就可以在网站的& ...

  2. 微信小程序开发入门篇(二)

    ✍.目录 配套视频教程:B站直达 微信小程序

  3. 微信小程序开发入门篇(一)

    ✍.目录 配套视频教程:B站直达 微信小程序

  4. 小程序开发入门基础篇-张代浩-专题视频课程

    小程序开发入门基础篇-1995人已学习 课程介绍         采用小程序wepy框架,初级讲解如何搭建小程序的开发环境,创建工程,语法介绍.开发调试等,课程采用实战代码案例作为教材,通俗易懂,简单 ...

  5. 【微信小程序】开发入门篇(二)

    前言 ❤️ 所谓信仰,可能就是在人们一无所剩的时候仅有的那种东西 ❤️ [微信小程序]开发入门篇(二) 一.小程序的宿主环境 (1)宿主环境简介 1.1 什么是宿主环境 1.2 小程序的宿主环境 (2 ...

  6. 【微信小程序】开发入门篇(一)

    前言 ❤️ 你可能认为一个人无法改变世界,但我想让你知道,这个世界也无法改变像我这样的人 ❤️ [微信小程序]开发入门篇(一) 一.小程序简介 (1)小程序与普通网页开发的区别 二.第一个小程序 (1 ...

  7. [HTML5]移动Web应用程序开发 HTML5篇 (四) 多媒体API

    介绍 本系列博客将主要介绍如今大红大紫的移动Web应用程序开发最重要的三个工具:HTML5,JavaScript, CSS3. 本篇是HTML5介绍的第三篇,主要介绍HTML5的Canvas API. ...

  8. 小程序onload_微信小程序开发入门之共享账本(十四)

    微信小程序开发入门之共享账本(十四) (备注:微信小程序的wxml文件相当于HTML文件,wxss文件相当于CSS文件,js文件就是JavaScript文件,数据库为NoSQL数据库,数据库脚本语言也 ...

  9. java程序开发个人笔记_Java程序开发入门笔记

    Java程序开发入门笔记 如果你是这一个错误的话:错误:编码GBK的不可映射字符 这是因为我们编写的代码一般都是utf-8的格式而控制台用的不是utf-8格式所以就会出现中文输出的错误.这个时候我们可 ...

最新文章

  1. 3 v4 中心节点固定_科研人员提出新型水声网络移动节点接入协议
  2. HTML列表标签,讲的明明白白!
  3. CSDN 联合 18 家大厂招聘直播,10 小时突破百万热度!
  4. 博图能打开s7200吗_透明胶真的能把车窗打开吗?现场实验给你看,能成功吗?...
  5. 《System语言详解》——1.SystemTap概述
  6. 网吧管理系统mysql_网吧管理系统数据库课程设计.doc
  7. xpwifi热点设置android,xp设置共享wifi热点方法分享
  8. 实验5、D/A转换实验
  9. 临沂鸿蒙文化城在哪,位置定了!临沂城区将再建多个公园!
  10. import java util_java里面import java.util.*;是什么用处?
  11. PayPal支付集成到自己Web网站
  12. 巡店系统如何应用于连锁加盟店管理
  13. BCJC:62:计算机体系之灵魂→OS→目标文件
  14. 清明节微信公众号图文排版有哪些经典素材?
  15. 团队从小到大,再到体验团队
  16. TCP/IP协议卷一(一)
  17. spyder运行时闪退解决办法:
  18. 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
  19. 提效篇 |当项目紧急入场,如何先测量后校正?
  20. 项目管理(项目管理中的重要角色项目经理)

热门文章

  1. 美团的android多渠道包的3种方法
  2. CString、std::string格式化字符串
  3. RHEL/CentOS 下安装yum源地址汇集---不定期更新
  4. 181920.net用 文字存档
  5. Linux服务器各种后门查杀
  6. VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti
  7. 使用 Termux 查看连接到手机热点的ip地址
  8. [Swift]LeetCode835. 图像重叠 | Image Overlap
  9. 在deepin系统中制作桌面快捷方式
  10. JavaWeb的一些理解