-
Remoting通信机制
-
Remoting介绍
-
主要元素
-
通道类型
-
激活方式
-
对象定义
-
Remoting介绍
主要元素
- 远程对象——远程对象是运行在服务器上的对象。客户端不能直接调用远程对象上的方法,而要使用代理。使用.NET,很容易把远程对象和本地对象区分开:即任何派生自 MarshalByRefObject 的类从来都不会离开它的应用程序域。客户端可以通过代理调用远程对象的方法。
- 信道——信道用于客户端和服务器之间的通信。信道包括客户端的信道部分和服务器的信道部分。.NET Framework 4 提供了 3 种信道类型,它们分别通过 TCP、HTTP 和IPC 进行通信。此外,还可以创建自定义信道,这些信道使用其他协议通信。
- 消息——消息被发送到信道中。消息是为客户端和服务器之间的通信而创建的。消息包含远程对象的信息、被调用方法的名称以及所有的参数。
- 格式化程序——格式化程序用于定义消息如何传输到信道中。.NET 4 有SOAP 格式化程序和二进制格式化程序。使用 SOAP 格式化程序可以与不是基于.NET Framework 的Web 服务通信。二进制格式化程序速度更快,可以有效地用在内部网环境中。当然,也可以创建自定义格式化程序。
- 格式化程序提供程序——格式化程序提供程序用于把格式化程序与信道关联起来。通过创建信道,可以指定要使用的格式化程序提供程序,格式化程序提供程序则定义把数据传输到信道中时所使用的格式化程序。
- 代理——客户端调用代理的方法,而不是远程对象的方法。代理分为两种:透明的代理和真实的代理。对于客户端,透明代理看起来与远程对象类似。在透明代理上,客户端可以调用远程对象实现的方法。然后,透明代理调用真实代理上的 Invoke()方法。Invoke()方法使用消息接收器把消息传递给信道。
- 消息接收器——消息接收器是一个侦听器(interceptor)对象,简称接收器。在客户端和服务器上都有侦听器。接收器与信道相关联。真实的代理使用消息接收器把消息传递到信道中,因此,在消息进入信道之前,接收器可以进行截获工作。根据接收器所处的位置,可以把接收器称为特使接收器(envoy sink)、服务器上下文接收器、对象上下文接收器等。
- 激活器——客户端可以使用激活器在服务器上创建远程对象,或者获取一个被服务器激活的对象的代理。
- RemotingConfiguration 类——该类是用于配置远程服务器和客户端的一个实用程序类。它可以用于读取配置文件或动态地配置远程对象。
- ChannelServices 类——该类是一个实用程序类,可用于注册信道并把消息分配到信道中
通道类型
TcpChannel
HttpChannel
激活方式
对象定义
服务器
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
1 TcpChannel channel = new TcpChannel(8080); 2 ChannelServices.RegisterChannel(channel);
1 RemotingConfiguration.RegisterWellKnownServiceType( 2 typeof(ServerRemoteObject.ServerObject), 3 "ServiceMessage",WellKnownObjectMode.SingleTon);
1 RemotingConfiguration.RegisterWellKnownServiceType( 2 typeof(ServerRemoteObject.ServerObject), 3 "ServiceMessage",WellKnownObjectMode.SingleCall);
1 RemotingConfiguration.ApplicationName = "ServiceMessage"; 2 RemotingConfiguration.RegisterActivatedServiceType( 3 typeof(ServerRemoteObject.ServerObject));
1 //获得当前已注册的通道; 2 IChannel[] channels = ChannelServices.RegisteredChannels; 3 //关闭指定名为MyTcp的通道; 4 foreach (IChannel eachChannel in channels) 5 { 6 if (eachChannel.ChannelName == "MyTcp") 7 { 8 TcpChannel tcpChannel = (TcpChannel)eachChannel; 9 //关闭监听; 10 tcpChannel.StopListening(null); 11 //注销通道; 12 ChannelServices.UnregisterChannel(tcpChannel); 13 } 14 }
1 TcpChannel channel = new TcpChannel(); 2 ChannelServices.RegisterChannel(channel);
1 ServerRemoteObject.ServerObject serverObj = (ServerRemoteObject.ServerObject)Activator.GetObject( 2 typeof(ServerRemoteObject.ServerObject), "tcp://localhost:8080/ServiceMessage");
1 RemotingConfiguration.RegisterActivatedClientType( 2 typeof(ServerRemoteObject.ServerObject), 3 "tcp://localhost:8080/ServiceMessage");
1 ServerRemoteObject.ServerObject serverObj = new ServerRemoteObject.ServerObject();
1 ServerObject(string pName,string pSex,int pAge) 2 { 3 name = pName; 4 sex = pSex; 5 age = pAge; 6 }
1 object[] attrs = {new UrlAttribute("tcp://localhost:8080/ServiceMessage")}; 2 object[] objs = new object[3]; 3 objs[0] = "wayfarer"; 4 objs[1] = "male"; 5 objs[2] = 28;
1 object[] attrs = {new UrlAttribute("tcp://localhost:8080/EchoMessage")}; 2 ObjectHandle handle = Activator.CreateInstance("ServerRemoteObject", 3 "ServerRemoteObject.ServerObject",attrs); 4 ServerRemoteObject.ServerObject obj = (ServerRemoteObject.ServerObject)handle.Unwrap();
基础补充
1 IDictionary tcpProp = new Hashtable(); 2 tcpProp["name"] = "tcp9090"; 3 tcpProp["port"] = 9090; 4 IChannel channel = new TcpChannel(tcpProp, 5 new BinaryClientFormatterSinkProvider(), 6 new BinaryServerFormatterSinkProvider()); 7 ChannelServices.RegisterChannel(channel);
1 IDictionary httpProp = new Hashtable(); 2 httpProp["name"] = "http8080"; 3 httpProp["port"] = 8080; 4 IChannel channel = new HttpChannel(httpProp, 5 new SoapClientFormatterSinkProvider(), 6 new SoapServerFormatterSinkProvider()); 7 ChannelServices.RegisterChannel(channel);
1 public interface IServerObject 2 { 3 Person GetPersonInfo(string name,string sex,int age); 4 }
1 public class ServerObject:MarshalByRefObject,IServerObject 2 { ......}
1 public interface IServerObject 2 { 3 Person GetPersonInfo(string name,string sex,int age); 4 } 5 public interface IServerObjFactory 6 { 7 IServerObject CreateInstance(); 8 } 9 public class ServerObject:MarshalByRefObject,IServerObject 10 { 11 public Person GetPersonInfo(string name,string sex,int age) 12 { 13 Person person = new Person(); 14 person .Name = name; 15 person.Sex = sex; 16 person.Age = age; 17 return person; 18 } 19 } 20 public class ServerObjFactory:MarshalByRefObject,IServerObjFactory 21 { 22 public IServerObject CreateInstance() 23 { 24 return new ServerObject(); 25 } 26 }
1 public interface IServerObject 2 { 3 Person GetPersonInfo(string name,string sex,int age); 4 } 5 public interface IServerObjFactory 6 { 7 IServerObject CreateInstance(); 8 }
1 RemotingConfiguration.RegisterWellKnownServiceType( 2 typeof(ServerRemoteObject.ServerObjFactory), 3 "ServiceMessage",WellKnownObjectMode.SingleCall);
1 ServerRemoteObject.IServerObjFactory serverFactory = 2 (ServerRemoteObject.IServerObjFactory) Activator.GetObject( 3 typeof(ServerRemoteObject.IServerObjFactory), 4 "tcp://localhost:8080/ServiceMessage"); 5 ServerRemoteObject.IServerObject serverObj = serverFactory.CreateInstance();
1 public class ServerObject:MarshalByRefObject 2 { 3 public ServerObject() 4 { 5 } 6 public Person GetPersonInfo(string name,string sex,int age) 7 { 8 Person person = new Person(); 9 person .Name = name; 10 person.Sex = sex; 11 person.Age = age; 12 return person; 13 } 14 }
1 public class ServerObject:MarshalByRefObject 2 { 3 public ServerObj() 4 { 5 throw new System.NotImplementedException(); 6 } 7 public Person GetPersonInfo(string name,string sex,int age) 8 { 9 throw new System.NotImplementedException(); 10 } 11 }
2619



被折叠的 条评论
为什么被折叠?



