蓝天旭日

高手如云,自己只是个菜鸟而已! 没有人在意你曾经的努力和散漫,只有人关注你是否有成就......
posts - 19, comments - 104, trackbacks - 0, articles - 6
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

数据通讯之Microsoft .Net Remoting入门(2)

Posted on 2008-01-02 15:04 蓝天旭日 阅读(...) 评论(...) 编辑 收藏
 

     上次以一个简单例子带我们领略了一下remoting的风采,今天我们逐步熟悉下remoting的基础知识。

     首先remoting是以通道来连接两个应用程序域之间来进行通讯的,客户端通过remoting访问通道以获得服务器端远程对象,再通过代理解析为客户端对象。远程对象代码可以运行在服务器上(分为服务器端激活的对象和客户端激活的对象),客户端通过remoting连接服务器,获得该服务对象并通过序列化在客户端运行

   在remoting可以同时注册多个通道的,但是必须采用不同的端口号和名称来标示,因为名称是通道的唯一标示符。

 远程对象

远程对象激活,分为客户端激活和服务器端激活

服务器端激活叫做WellKnow激活,不过很多书翻译成知名对象激活方式,它在一个众所周至的URI上发布这个类型,并且服务器进程回为此类型配置一个WellKnow对象,根据指定的地址和协议以及端口来发布对象。

 即  RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTest), "proname", WellKnownObjectMode.Singleton);

 也可以是

       RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTest), "proname", WellKnownObjectMode. SingleCall);

   SingleCall和Singleton是代表两中不同模式,

Singleton即为状态模式,可以理解为所有客户端公用一个对象,当它处于激活状态时,它会同时处理所有客户端请求,而并不关注是否是同一个客户端实例。

   SingleCall对象即叫做无状态模式,SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。其实很象我们平时所经常见到的Session

 客户端激活WellKnown模式不同,Remoting在激活每个对象实例的时候,会给它会分别指派一个URI给客户端激活类型,一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。另外,SingleCall和客户端激活对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。

对于客户端激活模式有两种方法:

1) 调用RemotingConfiguration的静态方法RegisterActivatedClientType()。这个方法返回值为Void,它只是将远程对象注册在客户端而已。具体的实例化还需要调用对象类的构造函数。
 RemotingConfiguration.RegisterActivatedClientType(               
                typeof(
RemoteTest),  "tcp://192.168.168.165:8081/proname ");
 
RemoteTest serverObj = new RemoteTest();

2) 调用进程ActivatorCreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的GetObject()不同的是,它要在客户端调用构造函数,而GetObject()只是获得对象,而创建实例是在服务器端完成的。CreateInstance()方法有很多个重载,我着重说一下其中常用的几个。
1 public static object CreateInstance(Type type, object[] args, object[] activationAttributes);

Args[]传递的其实就是构造方法的参数

2public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);

3 public static ObjectHandle CreateInstance(Type type);

4 public static ObjectHandle CreateInstance(Type typebool nonPulic);

      其实在日常使用中,以上只是带领大家了解了下remoting基础知识,在实际应用中,如果传递自定义对象,与元数据的相关性,接口知识的融合,都需要我们好好的融会贯通。

     偶希望“我丢出一块砖头,有玉的砸过来吧!”