.Net Remoting 入门教程-原理&&Hello

   背景:学习WCF时,初学时总对这个通讯框架不能全局掌握,那么就需要庖丁解牛,理解WCF产生的一些历史背景,不乏.NET Remoting,Web Service,Enterprise Service,MSMQ等基础知识的灌输,这个系列我会逐一为大家阐述,最后进入基于WCF的多线程文件管理系统的设计,如有不妥,敬请斧正。

   综述:.Net Remoting 可以用于访问另一个应用程序域(也可以是另一个服务器)中的对象,可以是进程间的,也可以是不同系统的进程间,这种CS的通讯机制更为快速,具体情况请听我盗来。

一、基本含义

l  .Net Remoting 位于System.Runtime.Remoting 命名空间及其子命名空间下,用于跨网络通讯。

l  .Net Remoting 提供了CS之间的紧密耦合,因为他们共享对象类型。

l  .Net Remoting无法用于不同平台的交互性设计,如果需要交互设计,应使用Web服务。

l  .Net 2.0中,可以获取由HttpChannel类,TcpChannel类和IpcChannel类代表的HTTP信道,TCP信道,IPC信道,还可以建立传输信道,以使用UDPIPX,SMTP,共享的内存机制或消息队列。

l  .Net Remoting 仅支持SAOP RPC 样式,Web 服务支持DOC样式和RPC样式。

l  CLR Object Rmoting .Net Remoting 的一个重要方面。所有语言结构,例如委托,接口,方法,属性和字段等,都可以与远程对象一起使用。它可以处理激活、分布式验证、生存期和调用环境等方面的工作。

二、体系基础

l  远程对象:是运行在服务器端的对象,客户端不能直接调用。和本地对象的区分办法:每个从MarshalByRefObject派生的类不会离开它的应用程序域。客户端可以通过代理访问远程对象的方法。

l  信道:用于客户机和服务器的通讯。

l  消息:消息会被发送到信道。消息包括远程对象信息、被调用方法名以及所有参数。

l  格式标示符:定义消息如何传递到信道中的。SOAP格式标示符和二进制格式标示符。

l  格式标示符提供程序:用于把格式标示符和信道联系起来。

l  代理对象:分为透明代理和真实代理。客户调用有远程对象提供的方法,透明代理对象调用真实代理对象上的Invoke()。Invoke()使用消息接收器吧消息传给信道。

l  消息接收器:是一个截取器(Interceptor)对象。根据接收器的位置,把接收器分为:特使接收器(envoy sink)、服务环境接收器、对象环境接收器等。

l  激活器:客户机可以使用激活器在服务器上创建远程对象,或获取一个被服务器激活的对象的代理对象。

三、基本原理

      

     

.Net 2.0 中,提供了Soap格式标示符和二进制格式标示符,格式符是“可插入的”。信道负责链接到服务器的监听网络接口上,或者发送已格式化的数据。

服务环境接收器是一个接收器链,链中的最后一个接收器继续调用对象环境接收器链。

最后一个对象环境接收器调用远程对象上的方法。

单个服务环境接收器可以访问多个对象环境接收器。

 

四、简单示例

l  远程对象

 

 1 public class Hello:MarshalByRefObject
 2     {
 3         public Hello()
 4         {
 5             Console.WriteLine("
调用构造函数");
 6         }
 7 
 8         ~Hello()
 9         {
10             Console.WriteLine("
析构函数被调用");
11         }
12         public String Greeting(String name)
13         {
14             Console.WriteLine("
打个招呼吧!");
15             return String.Format("Hello {0},are you ok?",name);
16         }
17     }

远程对象一定要继承: MarshalByRefObject

 

l  服务器端

 1 
 2     class Server
 3     {
 4         static void Main(string[] args)
 5         {
 6             //
8088 端口创建一个基于TCP协议的ServerChannel对象;
 7             var tcpChannel = new TcpServerChannel(8088);
 8         //
该信道使用ChannelServices 注册,使之可用于远程对象,并禁用安全性;
 9             ChannelServices.RegisterChannel(tcpChannel, false);
10         
11         //
8089 端口创建一个基于HTTP协议的ServerChannel对象;
12             var httpChannel = new HttpChannel(8089);
13             ////
该信道使用ChannelServices 注册,使之可用于远程对象,并禁用安全性;
14             ChannelServices.RegisterChannel(httpChannel, false);
15 
16             // 
远程对象类用RegisterWellKnownServiceType注册;
17             //WellKnownObjectMode.SingleCall :
18         //
每一个方法调用都会产生一个新的对象实例,此模式不保存远程对象中的状态
19             //WellKnownObjectMode.Singleton:
20             //
创建一个实例,供每次方法的调用,单一实例。
21             RemotingConfiguration.RegisterWellKnownServiceType(typeof(Hello),"Hi",WellKnownObjectMode.SingleCall);
22             Console.WriteLine("
按任意键退出");
23             Console.ReadKey();
24         }
25     }

 

l  客户端 

 1   class Client
 2     {
 3         static void Main(string[] args)
 4         {
 5             ////
这里你可以用任意端口,默认构造函数
 6             var tcpChannel = new TcpClientChannel();
 7             ChannelServices.RegisterChannel(tcpChannel,false);
 8 
 9             var httpChannel = new HttpChannel();
10             ChannelServices.RegisterChannel(httpChannel,false);
11 
12             //
对象创建有多种形式,Activator.CreateInstance(),没有匹配的方法,如果你试图匹配,
13             //未处理 System.MissingMethodException,未找到类型“HelloRemoting.Hello”上的构造函数。
14             var tcpHello = (Hello) Activator.GetObject(typeof (Hello), "tcp://localhost:8088/Hi");
15             if (null == tcpHello)
16             {
17                 Console.WriteLine("
无法定位到服务器。");
18                 return;
19             }
20             for (int i = 0; i < 3; i++)
21             {
22                 Console.WriteLine("TCP Greeting {0}", tcpHello.Greeting("winzheng"));
23             }
24 
25 
26             var httpHello = (Hello)Activator.GetObject(typeof(Hello), "http://localhost:8089/Hi");
27 
28             if (null == httpHello)
29             {
30                 Console.WriteLine("
无法定位到服务器。");
31                 return;
32             }
33             for (int i = 0; i < 3; i++)
34             {
35                 Console.WriteLine("Http Greeting {0}", httpHello.Greeting("winzheng"));
36             }
37 
38 
39             Console.ReadKey();
40         }
41     }

简单的例子完成了。

http://www.cnblogs.com/winzheng/archive/2009/07/11/1521701.html

整个工程源码下载:源代码

五、 下一节,将会讨论如下议题:

l  信道的功能和配置

l  格式标示符及其用法

l  ChannelServicesRemotingConfiguration

l  激活远程对象的不同方式,有状态,无状态对象

l  消息接收器功能

 

态度决定一切,技术改变生活作 者:winzheng                                                                          

出处:http://cnblogs.com/winzheng                                         

本文为原创作品,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

 


posted @ 2009-07-12 00:04  winzheng  阅读(7177)  评论(38编辑  收藏  举报