初探.net平台下的remoting技术

1:本地Client机process和远程Server机process 的通讯与交流
   机制:Client Process--------Channels-------Server Process

2:对象序列化与反序列化
   机制:保存对象的数据(xml文件或是二进制文件),传输后根据类的定义还原对象,这样使得对象能在进程间迁移。
 
3:如何使用远程对象
  (1)使用远程对象的引用  (本机只是使用远程对象的引用 proxy机制,类似于引用类型)
      Server定义:class ServerClass : MarshalByRefObject (必须继承该类)
      Cilent使用:ServerClass classProxy = (ServerClass)Activator.GetObject(typeof(RemotingSamples.ServerClass),
                                                                    "tcp://localhost:8085/ServerClass");
               或MarshalByRefObjectClass classProxy=ServerClass.GetMarshalByRefObject(); //方法返回的是一个按引用传递的对象 
  (2)将远程对象传递到本地使用 (远程对象在本地的一个副本 类似于value类型)
           [Serializable]
     定义:  class MyClass
     使用:SerializedClass myclass=ServerClass.GetSerializedclass();//方法返回的是一个按值传递的可序列化对象

4:远程对象如何被激活使用
  (1)服务端激活(Server-Activated) (WellKnow)
     WellKnownObjectMode.singleton(单实例)在服务端只实例化一次,每个客户端都使用这个实例
     WellKnownObjectMode.singlecall(但调用)每次有一个客户请求就实例化一个对象,这一个对象只为这个                            

       客户端服务  ,类似于B/S的无状态模型

  (2)客户端激活(Client-Activated)

5: Channels 通道(对通讯层的封装)
  (1)服务端定义注册一个通道(协议,服务端口)然后在这个通道上发布自己的远程对象服务,最后开始监听来自客户端的请求。

     //.NET内置http通道与内置Tcp通道    //定义通道
     HttpChannel chan1 = new HttpChannel(8086);  TcpChannel chan2 = new TcpChannel(8085);
                                     //注册通道:服务器开始监听这端口
     ChannelServices.RegisterChannel(chan1);      ChannelServices.RegisterChannel(chan2)

    
    //发布注册远程对象服务
    RemotingConfiguration.RegisterWellKnownServiceType
                (
                typeof(ServerClass),//远程对象的类型
                "ServerClass",    //URL表示哪个远程对象以便客户端同过url调用,如:tcp://192.168.101.20:8085/ServerClass
                WellKnownObjectMode.Singleton//采用服务端激活远程对象,并采用singleton模式即服务端单一实例
                );

  (2) 客户端要请求远程对象服务,也要在本地使用一个端口才能和服务端指定的端口通讯 ,这类似于用IE访问Web站点

    TcpChannel chan1 = new TcpChannel();//客户端不用指定端口,它会零时使用一个端口区通讯
    ChannelServices.RegisterChannel(chan1);//注册通道,以后与服务端的通讯就使用这个端口了
    //获得远程对象的引用
    Class classProxy = (ServerClass)Activator.GetObject(
                                                 typeof(RemotingSamples.ServerClass),//对象类型(客户端必须有远程对象的类定义)
                                                 "tcp://localhost:8085/ServerClass" //远程对象地址
                                                       );

6 采用XML配置文件的方式来 写通道信息 (什么类型的通道http ,tcp 使用端口,提供什么远程对象服务,采用什么激活方式,指定对象的生

命周期等)

7:对象生命周期
 远程对象有两种激活方式,一 服务端激活方式(wellknow),二是客户端激活方式
 对于服务端激活的singlecall模式,由于是类web站点的无状态,所以它的生命周期是以客户端的存在与否。
 对于服务端的singleton模式,服务端是以单一模式为客户端服务的,当有个客户端访问的时候,服务端开始激活对象,这个对象有生命周期

,如果客户端在指定的时间内没有访问远程对象,服务端自己会释放该对象
客户端激活方式;也需要指明对象的生命周期

8:如何发布远程对象服务
(1):使用应用程序发布 (.exe执行后开始监听)
(2):使用windows服务来发布 (启动服务后就可以开始监听客户端的请求了)
(3): 使用iis (.config中无需指名chanll ,iis:http 8080 类似于web服务器监听客户端的请求)

posted on 2007-07-18 12:57  lzh  阅读(150)  评论(0编辑  收藏  举报