初探.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服务器监听客户端的请求)