C#中的远程执行和分布式计算
来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 22:45 点击:次
摘要
远程执行是C#中一种使开发人员能够使用远程对象的基础架构。远程对象是一种位于调用者应用域之外的对象。本文中的例子说明了如何使用二种远程对象访问机制(值传递和地址传递),它还通过一个简单的、功能强大的任务服务器的实现说明了分布式计算中远程对象的强大功能。
任务服务器能够接受所有能实现ITask界面的对象,并在其应用域中运行这些对象。更为重要的是,它能够一次从多个客户端接受任务。
在学习完本篇文章后,读者将能够:
━━建立服务器/客户端对象之间的连接。
━━按值传递对象。
━━按地址传递对象。
━━理解远程任务分配的概念。
远程对象
远程对象通过地址传递对象或者通过对象的值传递对象。
在第一种情况下,对象的地址由应用域A传递到应用域B,但对象的方法调用在应用域A和应用域B之间。对象在应用域A中存在和运行,但在应用域B中也象是个本地的对象。
在第二种情况下,整个对象及其附属的实体(被称作对象图表)被串行化成字节的形式,并从应用域A被传送到应用域B。然后,对象在应用域B被“反串行化”并恢复到原来的状态。现在,对象就在应用域B上存在和运行了。
建立对象主机(也被称作服务器)
设立服务器需要作的第一步是在对象进行通讯的二个应用域间建立一条通道,它可以是一条TCP/IP通道或HTTP通道。TCP通道的速度较快,适用于对网络内信息包传输限制较少的网络使用,HTTP通道更灵活,适合在互联网等广域网上使用。
我们将使用TCP/IP通道,而且将在同一台机器的二个不同的应用域名上同时运行服务器端和客户机端。因此,输入下面的代码在TCP/IP堆栈上的8065端口创建通道myChannel:
下面是向.NET的通道服务注册myChannel通道,这将使该通道可以在服务器应用域之外被访问。我们可以通过下面的代码实现这一目的:
最后一步是告诉.NET的远程执行基础架构有关我们要开放的对象的有关情况,我们需要公布对象的类型和位置,客户端定位对象所使用的名称和.NET的远程基础架构对对这一对象调用的处理方式。我们可以通过下面的代码获取对象的类型:
通过下面的代码就可以向.NET远和基础架构注册该对象:
对象的调用有二种处理方式:Singleton和SingleCall。在Singleton方式中,在第一次客户端方法调用时创建对象,并保持对象存在直到客户端中止连接或对象自然死亡;在SingleCall方式中,每次客户端的方法调用都会创建对象,对象只在方法调用持续期间存在,一旦方法调用结束,对象就会死亡。SingleCall方式中,客户端连接不会随方法调用的结束而中止,只有对象会随着方法调用的结束而被杀死。
为远程对象建立客户端
对客户端的第一个要求是远程对象的类要在客户端的本机上,.NET远程执行基础架构代理将使用它对与远程对象间传递的信息进行解释和装配。
需要再次建立一个通道,然后向.NET远程基础架构进行注册,使该通道成为可用的:
需要注意的是,我们在创建通道时没有指定端口地址。我们将在要求服务器给出我们要调用的远程对象的引用时指定端口地址,代码如下所示:
第一个参数获取我们要定位的对象的类型,第二个参数指定远程对象的URL。一旦我们得到该对象,就需要将其类型由普通的对象转换为MyCoolObject类型。
现在,我们得到了位于服务器端的远程对象的引用,我们可以将该对象看作是本地的对象。
功能强大的任务服务器
任务服务器是一个如何利用.NET的按值传递远程对象
远程执行是C#中一种使开发人员能够使用远程对象的基础架构。远程对象是一种位于调用者应用域之外的对象。本文中的例子说明了如何使用二种远程对象访问机制(值传递和地址传递),它还通过一个简单的、功能强大的任务服务器的实现说明了分布式计算中远程对象的强大功能。
任务服务器能够接受所有能实现ITask界面的对象,并在其应用域中运行这些对象。更为重要的是,它能够一次从多个客户端接受任务。
在学习完本篇文章后,读者将能够:
━━建立服务器/客户端对象之间的连接。
━━按值传递对象。
━━按地址传递对象。
━━理解远程任务分配的概念。
远程对象
远程对象通过地址传递对象或者通过对象的值传递对象。
在第一种情况下,对象的地址由应用域A传递到应用域B,但对象的方法调用在应用域A和应用域B之间。对象在应用域A中存在和运行,但在应用域B中也象是个本地的对象。
在第二种情况下,整个对象及其附属的实体(被称作对象图表)被串行化成字节的形式,并从应用域A被传送到应用域B。然后,对象在应用域B被“反串行化”并恢复到原来的状态。现在,对象就在应用域B上存在和运行了。
建立对象主机(也被称作服务器)
设立服务器需要作的第一步是在对象进行通讯的二个应用域间建立一条通道,它可以是一条TCP/IP通道或HTTP通道。TCP通道的速度较快,适用于对网络内信息包传输限制较少的网络使用,HTTP通道更灵活,适合在互联网等广域网上使用。
我们将使用TCP/IP通道,而且将在同一台机器的二个不同的应用域名上同时运行服务器端和客户机端。因此,输入下面的代码在TCP/IP堆栈上的8065端口创建通道myChannel:
TcpChannel myChannel = new TcpChannel(8065); |
下面是向.NET的通道服务注册myChannel通道,这将使该通道可以在服务器应用域之外被访问。我们可以通过下面的代码实现这一目的:
ChannelServices.RegisterChannel(myChannel); |
最后一步是告诉.NET的远程执行基础架构有关我们要开放的对象的有关情况,我们需要公布对象的类型和位置,客户端定位对象所使用的名称和.NET的远程基础架构对对这一对象调用的处理方式。我们可以通过下面的代码获取对象的类型:
Type objectType = new MyCoolObject().GetType() |
通过下面的代码就可以向.NET远和基础架构注册该对象:
RemotingConfiguration.RegisterWellKnownServiceType( objectType, "MyCoolObject", WellKnownObjectMode.Singleton); |
对象的调用有二种处理方式:Singleton和SingleCall。在Singleton方式中,在第一次客户端方法调用时创建对象,并保持对象存在直到客户端中止连接或对象自然死亡;在SingleCall方式中,每次客户端的方法调用都会创建对象,对象只在方法调用持续期间存在,一旦方法调用结束,对象就会死亡。SingleCall方式中,客户端连接不会随方法调用的结束而中止,只有对象会随着方法调用的结束而被杀死。
为远程对象建立客户端
对客户端的第一个要求是远程对象的类要在客户端的本机上,.NET远程执行基础架构代理将使用它对与远程对象间传递的信息进行解释和装配。
需要再次建立一个通道,然后向.NET远程基础架构进行注册,使该通道成为可用的:
TcpChannel myChannel = new TcpChannel(); ChannelServices.RegisterChannel(myChannel); |
需要注意的是,我们在创建通道时没有指定端口地址。我们将在要求服务器给出我们要调用的远程对象的引用时指定端口地址,代码如下所示:
MyCoolObject mine = (MyCoolObject)Activator.GetObject( typeof(MyCoolObject), "tcp://localhost:8085/MyCoolObject"); |
第一个参数获取我们要定位的对象的类型,第二个参数指定远程对象的URL。一旦我们得到该对象,就需要将其类型由普通的对象转换为MyCoolObject类型。
现在,我们得到了位于服务器端的远程对象的引用,我们可以将该对象看作是本地的对象。
功能强大的任务服务器
任务服务器是一个如何利用.NET的按值传递远程对象
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>