摘要
遠程執行是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類型。
現在,我們得到了位於服務器端的遠程對象的引用,我們可以將該對象看作是本地的對象。
功能強大的任務服務器