O Wen

淡定~~~

remoting基础

1.主要运用在需要跨过应用程序域,与另外的应用程序域进行通信。

 

2.在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的。首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。

 

3.Remoting的通道主要有两种:Tcp和Http。TcpChannel类型放在名字空间System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket 的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。HttpChannel类型放在名字空间System.Runtime.Remoting.Channel.Http中。它提供了一种使用 Http协议,使其能在Internet上穿越防火墙传输序列化消息流。默认情况下,HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性。通常在局域网内,我们更多地使用TcpChannel;如果要穿越防火墙,则使用HttpChannel。

 

4.远程对象的激活方式
(1)在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。
(2)在Remoting中,远程对象的激活分为两大类:服务器端激活和客户端激活。
(3).Net Remoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。
 (1.SingleTon模式:此为有状态模式。类似.net中的Application。
 (2. SingleCall模式:SingleCall是一种无状态模式。类似.net中的Session。
(4)SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由 GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。

 

5.远程对象。由于Remoting传递的对象是以引用的方式,因此所传递的远程对象类必须继承MarshalByRefObject。当远程应用程序引用一个按值封送的对象时,将跨越远程处理边界传递该对象的副本。

 

6.开发要点:
服务端:
(1)注册通道
 (1 TCP通道和HTTP通道
 (2 也可以编写自己的通道
 //tcp通道注册
 TcpChannel tcpChannel = new TcpChannel(8085);
 ChannelServices.RegisterChannel(tcpChannel);

 //http通道注册
 HttpChannel httpChannel = new HttpChannel(8086);
 ChannelServices.RegisterChannel(httpChannel);


(2)注册远程对象
RemotingConfiguration.RegisterWellKnownServiceType
(
 typeof(RemotingObj),//RemotingObj是自定义的远程对象,在创建的时候需要继承MarshalByRefObject
 "test",//uri
 WellKnownObjectMode.Singleton//激活模式设置
);
 
客户端:
//使用TCP通道得到远程对象
TcpChannel tcpChannel = new TcpChannel();
ChannelServices.RegisterChannel(tcpChannel);
RemotingObj obj = (RemotingObj)Activator.GetObject( //RemotingObj是自定义的远程对象
typeof(RemotingObj),
"tcp://localhost:8085/test");
           
如果使用HTTP通道得到远程对象,将上面的通道修改为Http即可。

这样在客户端就可以使用远程对象Remoting的方法了。  

         

7.为了在开发remoting程序之后便于维护,可将客户端和服务端作为配置文件进行配置
(1)服务端激活
服务端
<configuration>
 <system.runtime.remoting>
  <application>
   <service>
    <wellknown
     mode="[Singleton/SingleCall]"
     type="[namespace.className], [dllName]"
     objectUri="[uri]" />
   </service>
   <channels>
    <channel port="8086" ref="http"/>
   </channels>
   <!--leaseManagerPollTime="7S"-->
   <lifetime
      leaseTime="7M"
      sponsorshipTimeout="7M"
      renewOnCallTime="7M"
      />
  </application>
 </system.runtime.remoting>
</configuration>

客户端
<configuration>
 <system.runtime.remoting>
  <application>
   <client>
    <wellknown type="[className], [dllName]" url="http://localhost:8086/url" />
   </client>
   <channels>
    <channel ref="http" port="0"></channel>
   </channels>
  </application>
 </system.runtime.remoting>
</configuration>


(2)客户端激活
服务端:
<configuration>
 <system.runtime.remoting>
  <application>
   <service>
    <activated type="ClientActivatedType, General"/>
   </service>
   <channels>
    <channel port="8080" ref="http" />
   </channels>
  </application>
 </system.runtime.remoting>
</configuration>

客户端:
<configuration>
 <system.runtime.remoting>
  <application>
   <client url="http://localhost:8080">
    <activated type="ClientActivatedType, General"/>
   </client>
   <channels>
    <channel ref="http" port="0" />
   </channels>
  </application>
 </system.runtime.remoting>
</configuration>

注:以上两种激活方式

服务端代码只需要加载配置文件即可:
RemotingConfiguration.Configure(xmlFileName);

客户端代码中只需要如下两部:
第一步:加载配置文件
RemotingConfiguration.Configure(@"xxx.config");
第二步:创建远程对象
RemotingObj obj = new RemotingObj();

 

8.服务端宿主
(1)Win Form:主要用于p2p开发
(2)Windows服务
(3)iis

阅读更多
个人分类: Remoting
想对作者说点什么? 我来说一句

Remoting基础学习

2007年07月17日 409KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭