Remoting 笔记(一)
Remoting创建方法
1. 创建远程对象
继承自System.MarshalByRefObject
里面只有public的方法才能被远程调用。
2. 创建一个应用程序作为“宿主(host)”,以接收客户请求,
注册通道
内置通道:TCP,HTTP
注册服务器激活的远程对象
(WellKnown)
Singleton,SingleCall
URL
运行宿主程序
3. 创建一个客户端调用远程对象。
注册通道 要和服务器一样
根据URL得到对象代理
使用代理调用远程对象
Remoting传递参数
要传递可序列化的类型和简单类型
传递自定义类型,要加上[Serializable]标签
Singleton VS SingleCall
都是服务器激活的对象(WellKnow)
Singleton(单实例)
在服务器端只实例化一次。
以后每次调用都访问同一个实例。不论同一客户端还是不同客户端。
可以维持状态。
对持有状态编程。
SingleCall(单调用)
每次调用都实例化新的实例。
更好的支持无状态编程模型。
效率更好,支持无状态编程。
Serialization VS. MarshalByRefObject
按值列集(Serialization)
得到远程对象的副本。
对副本的操作不影响远程对象。
不论远程对象是Singleton 还是SingleCall
按引用列集(MarshalByRefObject)
得到远程对象的引用,本地创建代理(Proxy)
能过(Proxy)对远程对象访问。
Singleton记录更改,SingleCall无状态。
Demo
Serialization:
[Serialization]
public class MySerialized{}
MarshalByRefObject:
public class MyRemote:System.MarshalByRefObject{}
Remoting模式:
服务器/客户端模式
如果实现端对端(Peer-to-Peer)
则每个端既是服务器又是客户端。
Remoting 笔记(二)
配置文件
随时更改,通道,端口,URL的设置而不用重编译。
Server端的配置文件:
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode=”Singleton” objectUrl=”SayHello” type=”RemotingSamples.HelloServer,General”/>
</service>
<channels>
<channel port=” 8086” ref=”http”/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
客户端配置文件:
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown url=”http://localhost:8086/SayHello” type=”RemotingSamplesHelloServer,General” />
</client >
<channels>
<channel port=” 0” ref=”http”/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
服务器端和客户端配置文件只有在<wellknown>节点中的配置不同。
配置文件的调用:
Server.cs:
RemotingConfiguration.Configure(“Server.exe.config”);
Client.cs
RemotingConfiguration.Configure(@”client.exe.config”);
HelloServer obj2=new HelloServer();
这里虽然使用了一个new 但并没有调用Hello的构造函数,只是调用了一个HelloServer的一个代理。
租约:
服务器端创建一个对象,如果一定时间没,没有动作,就把这个对象垃圾回收掉。
只对Singleton模式有效。
续约:
只要访问这个对象,这个对象就续约了。
隐式续约:
每次调用远程对象上的方法时,自动进行。
显示的续约:
ILease.Renew()
发起租约:
ISponsor接口
ILease.Register()。
50.5’