Remoting技术推出好多年了,一直没有系统的去了解它,之前粗略看了点资料后来也中断了。现在重新开始学习这一技术并记录下学习的过程。
也许有人说现在不是有了WCF吗。?Remoting不是集成到WCF中了吗?为什么还要学习它呢?首先:为不否认现在有了更好集成了Remoting、MSMQ、WEB SERVICE这些优秀技术的WCF,但是我想既然是集成,那WCF一定集中了上述技术的优点,并且WCF应该是在Remoting、MSMQ、WEB SERVICE的基础上推出的。既然这样那么WCF也应该有一些Remoting的特点。确实,后来为看WCF的基础的时候,发现WCF里面的一些东西就是Remoting里早就提及过的,也加快了学习WCF的进程。
其次:Remoting技术是MS思想的一部分,学习它我们学习它的架构,可以考虑为什么要这样,这样能有什么好处。从中也能使我们有一些思想方面的提升。
本节要点:
Remoting技术介绍
Remoting与SOCKET、WEB SERVICE各有什么优势
Remoting技术特点
Remoting技术基础概念
1、Remoting技术介绍。
Remoting是一种中应用程序域之间通讯的一种技术。
以前,程序之间的分割是以进程为单位的。.NET推出以后,对.NET这一块的技术来说以应用程序域为分割。那么什么是应用程序域?它的作用是什么?接触过.NET的程序员都知道一个概念----托管代码。而我们的进程,它是不知道托管代码的。所以托管代码是无法直接在进程运行。为了使托管代码运行中非托管的进程中,就需要应用序域。应用序域运行中非托管的进程中,并为托管代码提供运行环境。注意应用程序域AppDomain是一个非托管的对象。我们新建一个应用程序,应用程序的名字就是默认的应用程序域的名字。当然,我们可以中默认应用程序域新建应用程序域。我们可以测试一下AppDomain。代码如下:
1 static void Main(string[] args)
2 {
3 AppDomain currentDomain = AppDomain.CurrentDomain;
4 Console.WriteLine(currentDomain.FriendlyName);
5
6 AppDomain newDomain = AppDomain.CreateDomain("newDomain");
7 Console.WriteLine(newDomain.FriendlyName);
8 Console.ReadLine();
9
10
11 }
运行结果如下:
Remoting就是中如AppDomainTest与newDomain之间通讯的技术,不管这两个应用程序域是否在同一电脑中。
2、与socket、WEB SERVICE的比较
Remoting:客户端与服务端耦合比较紧密,因为他们之间共享相同的对象类型。它给CLR对象提供在不同应用程序域之间调用方法的功能。
SOCKET:需要指明所使用的协议,即TCP还是UDP。另外还需还需要定义定义数据传输协议,也就是数据包的组织方式(TLV等)。我们不仅要定义这些,还要自己创建并管理线程。
WEB SERVICE:它使用SOAP,数据通过XML的形式进行通讯。与平台无关性,无论你是用.NET开发,还是JAVA开发,
都可以通过它进行通讯。在客户端与服务端的耦合比较松散。
3、Remoting基础概念介绍
对客户端来说:信道、格式器、代理。
对服务端来说:信道、格式器、Stack Builder。
信道:信道用户客户机与服务器之间通讯的通道。由客户端传输到服务端以及从服务端传送到客户端都是通过它完成的。FRAMEWORK提供三种类型的信道:TCP、HTTP、IPC。
格式器:客户端与服务端的通讯的数据必须以一定的格式进行传送。客户端与服务端将要传送的消息经过格式器转化,通过通道进行传送。
代理:客户端调用的是代理对象上的方法,而不是远程对象上的方法。代理对象分为透明代理、真实代理。在客户眼中,透明代理对象看起来与远程对象类似。在透明代理对象上,客户机可以调用有远程对象提供的方法,然后透明代理调用真实代理对象上的Invoke。Invoke()方法使用消息接收器把消息传送给信道。
Stack Builder:读取有格式器进过反序列化而来的消息,然后依据消息创建对象,调用方法。返回时,Stack Builder将返回值封装成消息,传递给格式化器。
远程对象:即运行中服务器端的对象。客户端不能直接调用远程对象上的方法,而要使用代理。使用.NET很容易把远程对象和本地对象分开:即每一个从MarshalByRefObject继承而来的类都不会离开它的应用程序域。客户端可以通过代理对象来调用远程对象上的方法。
消息:消息发送到信道中。它是为客户端与服务端之间的通讯而创建的。消息包含远程对象的消息、被调用方法的名称以及所有参数。
格式标识符:用于定义消息是如何传递到信道中的。.NET有SOAP格式标识符、二进制格式标识符。使用前者可以与不是基于.NET的WEB服务通讯,而使用后者,速度更快,可以有效地用中企业网络中。当然,也可以自己定义合适标识符。
格式标识符提供程序:用于把格式标识符与信道联系起来。在创建信道时,可以使用指定的格式标识符提供程序,格式标识符提供程序则定义数据传输到信道中时所使用的格式标识符。
消息接受器:消息接受器是一个截取器对象,简称接收器。在客户端与服务端都有这种接收器。接收器与信道联系。真实代理对象使用消息接接受器把消息传递到信道中,因此,在消息进入信道之前,接收器可以进行截取工作。根据接收器所处位置,可以把接收器成为特使接收器(envoy sink)、服务器环境接收器、对象环境接收器。
激活器:客户机可以使用激活器在服务器上创建远程的对象,或者获取一个被服务器激活的对象的代理对象。
RemotingCOnfiguration类:用户配置远程服务器和客户机的一个实用类。它可以读取配置文件或动态配置远程对象
ChannelServices类:可用于注册信道并把消息分派到信道中。