.NET Remoting 学习

1月8日 周二 阴云密布

听说明天是暴雪,这真是个不幸的消息。
算了,该来的总得来。不如老老实实的工作,应该说是踏踏实实的学习,哈哈。总觉得这样的环境有些安逸,让人提不起来斗志。但是工作的时间总该是专心致志的,这点倒还是不赖。可是下班后的时间,总是觉得颓废。心里一直有股热流,呼之欲出。可能会是下个转折点吧,莫名期待。
这日记写着写着会不会让人越发感性,细思恐极!我还是记录点学习进度吧~~

.NET Remoting

什么是 Remoting,简而言之,我们可以将其看作是一种分布式处理方式。 .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。在 Remoting 中是通过通道(channel)来实现两个应用程序域之间对象的通信的。

实现步骤

[服务端]

1. 注册通道

要跨越应用程序域进行通信,必须实现通道。如前所述,Remoting 提供了 IChannel 接
口,分别包含 TcpChannel 和 HttpChannel 两种类型的通道。这两种类型除了性能和序列化数
据的格式不同外,实现的方式完全一致,因此下面我们就以 TcpChannel 为例。

注册 TcpChannel,首先要在项目中添加引用“System.Runtime.Remoting”,然后 using
名字空间:System.Runtime.Remoting.Channel.Tcp。代码如下:

TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel); 

在实例化通道对象时,将端口号作为参数传递。然后再调用静态方法 RegisterChannel()来注
册该通道对象即可。

2.注册远程对象

注册了通道后,要能激活远程对象,必须在通道中注册该对象。根据激活模式的不同,
注册对象的方法也不同。
1) SingleTon 模式
对于 WellKnown 对象,可以通过静态方法
RemotingConfiguration.RegisterWellKnownServiceType()来实现:

RemotingConfiguration.RegisterWellKnownServiceType(
typeof(ServerRemoteObject.ServerObject),
"ServiceMessage",WellKnownObjectMode.SingleTon); 

2)SingleCall 模式
注册对象的方法基本上和 SingleTon 模式相同,只需要将枚举参数
WellKnownObjectMode 改为 SingleCall 就可以了。

RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(ServerRemoteObject.ServerObject),
 "ServiceMessage",WellKnownObjectMode.SingleCall); 

3)客户端激活模式
对于客户端激活模式,使用的方法又有不同,但区别不大,看了代码就一目了然。

RemotingConfiguration.ApplicationName = "ServiceMessage";
RemotingConfiguration.RegisterActivatedServiceType(
 typeof(ServerRemoteObject.ServerObject)); 
3.注销通道

如果要关闭 Remoting 的服务,则需要注销通道,也可以关闭对通道的监听。在 Remoting
中当我们注册通道的时候,就自动开启了通道的监听。而如果关闭了对通道的监听,则该通
道就无法接受客户端的请求,但通道仍然存在,如果你想再一次注册该通道,会抛出异常。

//获得当前已注册的通道;
IChannel[] channels = ChannelServices.RegisteredChannels;
//关闭指定名为 MyTcp 的通道;
foreach (IChannel eachChannel in channels)
{
 if (eachChannel.ChannelName == "MyTcp")
 {
 TcpChannel tcpChannel = (TcpChannel)eachChannel;
 //关闭监听;
 tcpChannel.StopListening(null);
 //注销通道;
 ChannelServices.UnregisterChannel(tcpChannel);
 }
}

[客户端]

客户端主要做两件事,一是注册通道。这一点从图一就可以看出,Remoting 中服务器
端和客户端都必须通过通道来传递消息,以获得远程对象。第二步则是获得该远程对象。

1.注册通道
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel); 

注意在客户端实例化通道时,是调用的默认构造函数,即没有传递端口号。事实上,这个端
口号是缺一不可的,只不过它的指定被放在后面作为了 Uri 的一部分。

2. 获取远程对象

(1)WellKnown 激活模式

ServerRemoteObject.ServerObject serverObj =
(ServerRemoteObject.ServerObject)Activator.GetObject(
 typeof(ServerRemoteObject.ServerObject),"tcp://localhost:8080/ServiceMessage"); 

首先以 WellKnown 模式激活,客户端获得对象的方法是使用 GetObject()。其中参数
第一个是远程对象的类型。第二个参数就是服务器端的 uri。如果是 http 通道,自然是用
http://localhost:8080/ServiceMessage 了。因为我是用本地机,所以这里是 localhost,你可以
用具体的服务器 IP 地址来代替它。端口必须和服务器端的端口一致。后面则是服务器定义
的远程对象服务名,即 ApplicationName 属性的内容。

(2)客户端激活模式
如前所述,WellKnown 模式在客户端创建对象时,只能调用默认的构造函数,上面的代
码就说明了这一点,因为 GetObject()方法不能传递构造函数的参数。而客户端激活模式则可
以通过自定义的构造函数来创建远程对象。

客户端激活模式有两种方法:
1) 调用 RemotingConfiguration 的静态方法 RegisterActivatedClientType()。这个方法返回值为Void,它只是将远程对象注册在客户端而已。具体的实例化还需要调用对象类的构造函数。

 RemotingConfiguration.RegisterActivatedClientType(
 typeof(ServerRemoteObject.ServerObject), "tcp://localhost:8080/ServiceMessage");
 ServerRemoteObject.ServerObject serverObj = new ServerRemoteObject.ServerObject(); 

2) 调用进程 Activator 的 CreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的 GetObject()不同的是,它要在客户端调用构造函数,而 GetObject()只是获得对象,而创建实例是在服务器端完成的。CreateInstance()方法有很多个重载,我着重说一下其中常用的两个。

a、public static object CreateInstance(Type type, object[] args, 
object[] activationAttributes);
b、public static ObjectHandle CreateInstance(string assemblyName, string typeName,
object[] activationAttribute); 

补充

通过上面的描述,基本上已经完成了一个最简单的 Remoting 程序。这是一个标准的创建 Remoting 程序的方法,但在实际开发过程中,我们遇到的情况也许千奇百怪,如果只掌握一种所谓的“标准”,就妄想可以“一招鲜、吃遍天”,是不可能的。

注:本文参考:http://www.cnblogs.com/xia520pi/ 虾皮工作室,仅供学习,请勿转载!

你可能感兴趣的:(.NET Remoting 学习)