.NET简谈组件程序设计之(初识NetRemoting)

在本人的“.NET简谈组件程序设计之(初识远程调用)  ”一文中,我们了解到什么是远程调用或者说在.NET平台上远程调用是什么样子的,可能和偏低层(Socket\Rpc)的远程调用有点距离。这只是系统为我们封装了假象而已,看不见不代表没有这逻辑,是为我们减轻了劳动负担。[王清培版权所有,转载请给出署名]

这篇文章我们来简单的了解一下在.NET平台上有一个强有力的远程调用武器,也是上一篇文章中我一笔带过的远程英雄.NetRemoting。

其实在.NET平台里面到处都能看见Remoting的影子,只不过我们平时都很少有机会与它接触,因为它通常工作于“后端”,躲在界面显示技术(如:Winform\Asp.net\Wpf.)

界面显示层是将信息以友好的方式展现在用户面前,但是真正的英雄通常都在背后默默的支持它,以更华丽的效果展现。(如:Thread\WebService\Remoting\Wcf...)。

其实在我们不断学习的过程中会慢慢的在我们脑海里浮现出我们所学习的东西的模型,比如我们是专研.NET这门技术,那么在我们脑子里是否已经有了一个简单而模糊的阴影,能看见这种阴影才证明我们刚刚入门。如果未曾有这种感觉,那么我们对他还是一无所知,所谓知己知彼方能百战百胜,说明我们还未入门。因为精通都是从模糊开始的,没有人一跃而过。(这只是本人对学习过程中的一点小小的感悟)

那么.NetRemoting是何许人也,它是什么?一般在哪里才能看见它?这篇文章就是来介绍这位大人物的。[王清培版权所有,转载请给出署名]

定义:.NetRemoting是.NET平台里面一个专门用来处理远程调用的框架,是已经为我们做好的、现成的框架,我们可以利用他来进行远程调用。

上面是我对他的一个简单的定义吧。上篇文章我简单的介绍了什么是远程调用,在.NET里面只要是跨AppDomain(应用程序域)的都属于远程调用,因为.NET在我们物理宿主进程里面又抽象了一个他自有的逻辑宿主。在操作系统看来,AppDomain是不存在的,但是在CLR看来它是存在的,我们的程序要想跑起来必须进过CLR的一系列的逻辑部署,也就是构造这么一个逻辑空间。[详情请看本人的“.NET简谈组件程序设计之(AppDomain应用程序域) ”一文

.NetRemoting基本结构

那么既然是框架它就肯定有一个结构,也就是他的工作原理。

在Remoting没有出来之前,如果不进过一番复杂的编写,我想夸AppDomain调用可能只局限于统一进程内了。(这句话可能会引起误会,我是说在.NET现有的框架基础上而言。)

然而有了Remoting之后,一切变的简单多了,我们只需要了解简单的网络原理、套接字原理、协议等等就能很好的配置这个框架,以进行远程调用。它将远程调用延伸到了任何地方,不只是在同一进程内了。

原有的同一进程内的远程调用框架没有变,Remoting只是添加了点东西以支持夸进程夸网络。(比如:RefObjet对象\RealProxy对象)。

之前我说过Remoting是一个高扩展性的框架,从上图中我们可以看出它的基本结构是很清晰的、很模块化。都是通过接口关联,只要我们熟悉了之后就能切入自己的逻辑。[王清培版权所有,转载请给出署名]

.NetRemoting示例

在.NET里面不管是夸进程还是夸机器之间的AppDomain调用都是通过远程调用技术进行处理的。在同一个进程里面可能不会涉及到物理上的通讯,直接拿到代理就OK了,只是一些逻辑宿主之间的处理。

那么我们来看一个简单的示例:

1:对照上图,最下面的是关于通讯的端点,那么我们首先需要设置一个能够进行远程通讯的地址,在Remoting里面就是Channel(信道),消息从信道出去流线服务器端的信道。

在Remoting里面系统提供给了我们三种类型的信道,分别是Ipc\Tcp\Http。Ipc:是进程间调用用的,Tcp:是用TCP的协议来处理通讯,HTTP:是用HTTP协议来处理通讯。我们根据项目的需要可以进行设置。

代码注册信道:

IDictionary dipropertis = new Hashtable();
           dipropertis["name"] = "Myserverchannel";//信道名称
           dipropertis["port"] = 8005;//端口
           IChannel tcpchannel = new TcpChannel(dipropertis, null, binaryformatter);//TCP信道
           ChannelServices.RegisterChannel(tcpchannel);
           IChannel httpchannel = new HttpChannel(8006);//HTTP
           ChannelServices.RegisterChannel(httpchannel);
           IChannel ipcchannel = new IpcChannel("myport");//IPC进程间通讯
           ChannelServices.RegisterChannel(ipcchannel);

 

所有的通道Channel都是来自IChannel接口,所以我们可以定义自己的一些通讯实现。

上图代码中我分别注册了三种类型的通道,通道也就是通讯的过程。对于IPC类型的通道我们只需要提供一个管道名称就行了。如果我们使用默认的Channel构造函数,只需要提供端口就行了,但是如果要设置信道名称就需要用字典的方式进行多属性的设置,因为没有提供这方面的构造函数重载。在我们注册第一个TCP通道的时候,我定义了一个键值对的Hashtable,键name的代表信道名称,port代表端口。

上述代码看来,通道就是具体通讯的细节,终结点在哪里?使用的消息是什么?这样就能完好的把消息送到网络的另一端。进程间通讯IPC是通过管道的机制实现的,所以不涉及端口、网络。

代码注册消息格式化器:

通道是位于Remoting整体框架的最末端,底层通讯的细节。在这上面一层是消息格式化器,也就是对象的序列化过程,在对象的持久化状态和托管内存状态之间转换。

我们来看一下怎么在服务端注册消息格式化器的:

//注册信道
BinaryServerFormatterSinkProvider binaryformatter = new BinaryServerFormatterSinkProvider();//信道消息处理程序
binaryformatter.TypeFilterLevel = TypeFilterLevel.Full;//完全序列化级别
SoapServerFormatterSinkProvider soapformatter = new SoapServerFormatterSinkProvider();
soapformatter.TypeFilterLevel = TypeFilterLevel.Full;

 

系统也我们实现了两种类型的对象格式化方式,二进制、SOAP。

对象的TypeFilterLevel属性是设置格式化器的级别,由于系统默认的序列化级别只能序列化简单的托管类型,如果要想序列化复杂而危险的对象我们需要设置该枚举值。

 在注册通道的时候可以将格式化器的实例带进去,好让通道知道它的消息如何被格式化。

 代码注册服务类型:

在往上走就到代理的模块,代理在这篇文章中我就不扯了,对于这篇文章它不是重点。代理在我们日常开发中不太会去深入的去研究它,比较复杂,基本上被隐藏了。我们只需要理解它就行了。有兴趣的可以查看相关资料。

我们来看一下最上层的代码:

//注册类型
RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyClassLibrary.Class1), "Class1", WellKnownObjectMode.SingleCall);
//客户端激活模式
RemotingConfiguration.RegisterActivatedServiceType(typeof(MyClassLibrary.Class2));

 

服务器端要想提供服务,就需要将提供服务的对象进行注册。好让服务器知道提供了那些服务。

RemotingConfiguration对象提供了很多静态方法,我们可以通过RegisterWellKnownServiceType方法注册服务器端激活模式,或者通过RegisterActivatedServiceType方法注册客户端激活模式。这两种激活模式的差别在后续的文章中讲会讲解到。[王清培版权所有,转载请给出署名]

客户端代码:

我们看一下客户端该做些什么:

string uri = "tcp://localhost:8005";
RemotingConfiguration.RegisterActivatedClientType(typeof(MyClassLibrary.Class2), uri);
RemotingConfiguration.RegisterWellKnownClientType(typeof(MyClassLibrary.Class1), uri + "/Class1");

 

客户端只需要通过RemotingConfiguration中的关于客户端注册的方法注册远程服务的类型,当我们在实例化对象的时候Remoting会自动的帮我们进行远程处理。

 结:这篇文章只是粗略讲解一下Remoting的结构。下一篇文章我们将更深入一点的了解Remoting,包括激活模式、管理配置等。

时间: 2024-07-29 13:21:20

.NET简谈组件程序设计之(初识NetRemoting)的相关文章

.NET简谈组件程序设计之(初识远程调用)

在.NET1.0版本出来的时候,要想进行远程调用基本上都是通过WebService的方式.而随着.NET2.0版本的出现,我们可以通过一个更加方便且高扩展性的框架来进行编写远程调用的程序,也就是我们都比较熟悉的.NetRemoting. 网上对.NetRemoting技术讲解的文章不计其数,但是很少有一本比较全面的.系统的学习书籍.我们都是从哪些零散的知识里慢慢摸索,效果不太理想. 今天我也来简单的介绍一下我理解的Remoting.不仔细研究一下还真不知道它的厉害,完全的托管平台.高扩展性.灵活

.NET简谈组件程序设计之(初识.NET线程Thread)

由于多线程的内容比较多我会用几篇文章来讲解. 多线程在我们日常开发过程中用的很多,上一篇".NET简谈组件程序设计之(异步委托) "详细的讲解了基于委托的多线程使用,委托是基于后台线程池的原理,这篇文章将主要介绍直接使用Thread对象来实现多线程. 当然使用Thread没有使用Delegate那么容易,毕竟多线程跟异步调用是两个相差很大的技术方向,我也是略懂点皮毛,在此献丑给大家,如有讲的不对的地方还请指出.[王清培版权所有,转载请给出署名] 我们先来理解几个概念,以方便我们学习.

.NET简谈组件程序设计之(初识序列化、持久化)

 今天我们来学习在组件开发中经常用到的也是比较重要的技术"序列化". 序列化这个名词对初学者来说不太容易理解,有点抽象.我们还是用传统的分词解释吧,肯定能搞懂它的用意是什么. 解释:数学上,序列是被排成一列的对象(或事件):这样,每个元素不是在其他元素之前,就是在其他元素之后.这里,元素之间的顺序非常重要. 那么我们对照这样的解释来分析一下我们程序中的序列化什么意思.都知道对象的状态是在内存中实时存着的,对象的状态在初始化的时候是通过系统分配的,在后期的程序运行过程中可能对它进行过一些

.NET简谈组件程序设计之(渗入序列化过程)

在本人的上一篇文章".NET简谈组件程序设计之(初识序列化.持久化) "中,我们基本上了解了什么叫序列化和持久化.通过系统为我们提供的服务,我们可以很方便的进行二进制序列化.SOAP协议序列化. 今天这篇文章是来讲解怎么运用一些高级的功能,在序列化.反序列化过程中进行一些控制.[王清培版权所有,转载请给出署名] 这里穿插一句题外话:其实在我们自己编写组件的时候真的有好多东西可以借鉴.NET平台的一些优点,它的功能都不是死的,可以订阅.可以切入,在我们编写组件的时候,我们其实也要好好考虑

.NET简谈组件程序设计之(上下文与同步域)

我们继续学习.NET多线程技术,这篇文章的内容可能有点复杂.在打破常理之后,换一种新的思考模型最为头疼.这篇文章里面会涉及到一些不太常见的概念,比如:上下文.同步域等等.我也是最近才接触这些关于组件编程方面的高深技术,大家一起学习,再大的困难也是有时间限制的,只要我们坚持. 在本人的上一篇文章".NET简谈组件程序设计之(多线程与并发管理一)"中,只是初步的带领我们学习一下关于多线程的一些基本的原理,包括线程切换,线程的开始.执行.等待.结束. 这篇文章的重点是学习关于线程的同步.互斥

.NET简谈组件程序设计之(手动同步)

在上一篇文章".NET简谈组件程序设计之(上下文与同步域)"中,我们学习了关于一些上下文和同步域的概念,可以利用这两个技术来进行自动同步. 今天我们主要学习怎么手动来执行同步,能从更小的粒度进行封锁,以达到最大程度的吞吐量.[王清培版权所有,转载请给出署名] 我们知道线程是进程的运行实体,进程是资源分配单位,而线程是执行单位.照书上所说,线程是程序的执行路径,当我们分配一个线程的时候,要确定线程的执行路径是什么,也就是代码中的ThreadStart委托所指向的入口点方法. 一旦我们手动

.NET简谈组件程序设计之(详解NetRemoting结构)

在本人的上一篇文章中只是简单的介绍了一下.NETRemoting的一般概念和基本的使用.这篇文章我想通过自己的学习和理解将对.NETRemoting的整体的一个框架进行通俗的讲解,其中最重要的就是信道(管道)处理模型思想,这里面蕴含了很多的设计原理.[王清培版权所有,转载请给出署名].NETRemoting远程处理架构是一个半成品,是.NET给我们的扩展框架,要想用于商业项目必须进行一些安全.性能方面的控制.要想进行一定深度的扩展那就要必须了解它的整体结构,各个点之间的关系才能很好的控制它. 网

.NET简谈组件程序设计之(delegate与event关系)

 本人最近一段时间在学习关于.NET组件编程方面的技术,在学习过程中确实有很多好的东西需要与大家分享.[王清培版权所有,转载请给出署名] 关于什么叫组件编程,其实就是利用.NET来开发基于组件模型的程序,面向组件编程而非面向对象编程,这是一个高度,没有很长时间的学习与磨练 是体会不到这个感觉的.我们现在的开发思想应该是以面向对象为主的,但是如何提升这个高度,只有慢慢的学习了. 其实面向组件编程包含了面向对象编程思想,将一组功能独立的封装起来供以后重复使用,但是在开发组件的过程中需要使用到面向对象

.NET简谈组件程序设计之(AppDomain应用程序域)

最近在苦学.NET底层框架模型,发现.NET深入真的不是一般的难,不开源.没有相关系统的官方的书籍做学习资料,只能零散的看MSDN.要想摸熟.NET的模型真的并非易事.慢慢来吧.[王清培版权所有,转载请给出署名] .NET应用程序域(AppDomain)是我们所有.NET应用程序的逻辑宿主容器.初次接触会感觉到AppDomain离我们日常开发比较远,不常用到.其实是我们很少接触一些复杂而底层的系统结构.在日常的开发中,我们多数是基于数据库的管理信息系统(MIS),做增.删.改.查的操作.我始终认