Remoting专题1(客户端和服务端之间的通信)

一  Net Remoting基础
         什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式。
       .NeT Remoting提供了允许对象通过应用程序域与另一个对象进行交互的框架。
        这也正是我们使用Remoting的原因。为什么呢?在windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。  如果不采用进程间通信(RPC)机制,则在一个进程中的执行代码就不能访问另一个进程。
  然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。
         在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信。如图所示:
         Remoting专题1(客户端和服务端之间的通信)_第1张图片

 

             首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。

             远程对象代码可以运行在服务器上(以服务器为激活的对象),然后客户端在通过remoting连接服务器,获得该服务对象并通过序列化在客户端运行。(如把中间层部署在服务器端,客户端通过remoting访问服务器端的中间层,这里的中间层值连接数据库的方法和sql语句)

      1  remoting的通道主要有两种:TCP和HTTP。在Net中,

        System.Runtime.Remoting.Channel中定义了 IChannel 接口。IChannel 接口包括了 TcpChannel 通道类型和 Http 通道类型。它们分别对应 Remoting 通道的这两种类型。
         2 远程对象的激活方式 
           在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象,称为对象的激活。在 Remoting 中,远程对象的激活分为两大类:服务器端激活和客户端激活。
            (1)服务器端激活:又叫做wellKnow方式,很多翻译为知名对象。为什么称为知名对象激活模式呢?是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。
                  然后该服务器进程会为此类型配置一个wellKnown对象,并根据指定的端口或地址发布对象。.Net Remoting把服务器激活又分为SingleTon 模式和 SingleCall 模式两种。 
                SingleTon 模式:此为有状态模式。如果设置为 SingleTon 激活方式,则Remoting 将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon 实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon 实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为 SingleTon 方式,则第一个客户获得值为 1,第二个客户获得值为 2,因为他们获得的对象实例是相同的。如果熟悉 Asp.Net 的状态管理,我们可以认为它是一种 Application 状态。
               SingleCall模式:SingleCall是一种无状态的模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是 1。我们仍然可以借鉴 Asp.Net 的状态管理,认为它是一种 Session 状态
        (2) 客户端激活。与 WellKnown 模式不同,Remoting 在激活每个对象实例的时候,会给每个客户端激活的类型指派一个 URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall 模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而
SingleCall 则是要等到调用对象方法时再创建。其次,SingleCall 模式激活的对象是无状态的,对象生命期的管理是由 GC 管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由 GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。
 2 远程对象的定义
      前面讲到,客户端在获取服务器端对象时,并不是获得实际的服务端对象,而是获得它
的引用。因此在 Remoting 中,对于远程对象有一些必须的定义规范要遵循。
    由于 Remoting 传递的对象是以引用的方式,因此所传递的远程对象类必须继承
MarshalByRefObject。
 
Remoting专题1(客户端和服务端之间的通信)_第2张图片
         这个类只实现了最简单的方法,就是设置一个人的基本信息,并返回一个 Person 类对
象。注意这里返回的 Person 类。由于这里所传递的 Person 则是以传值的方式来完成的,而Remoting 要求必须是引用的对象,所以必须将 Person 类序列化。

           因此,在 Remoting 中的远程对象中,如果还要调用或传递某个对象,例如类,或者结构,则该类或结构则必须实现串行化 Attribute[SerializableAttribute]

Remoting专题1(客户端和服务端之间的通信)_第3张图片

       将该远程对象以类库的方式编译成 Dll。这个 Dll 将分别放在服务器端和客户端,以添加引用。
       在 Remoting 中能够传递的远程对象可以是各种类型,包括复杂的 DataSet 对象,只要
它能够被序列化。远程对象也可以包含事件,但服务器端对于事件的处理比较特殊,我将在
本系列之三中介绍。

你可能感兴趣的:(Remoting专题1(客户端和服务端之间的通信))