參考文件:
https://blog.csdn.net/liuxuezong/article/details/7211762
通過ior獲取對象引用,可以讀ior文件或者傳ior字符串,【參考文件】爲傳ior字符串,其本質都是一樣的,來實現客戶端調用服務器端對象引用的函數。
自己寫的基於項目的測試,就不貼了,由於太懶了,直接用【參數文件】實例啦。
服務器端程序:
#include <iostream.h>
#include "time.h"
class Time_impl:public virtual POA_Time
{
public :
virtual short get_gmt();
};
short Time_impl::get_gmt()
{
return 1;
}
int main(int argc, char* argv[])
{
try {
//orb對象請求適配器
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
//resolve_initial_references可以獲取到一些CORBA的對象引用
CORBA::Object_var obj =
orb->resolve_initial_references("RootPOA");
//_narrow緊縮函數,有點強轉的意思
PortableServer::POA_var poa =
PortableServer::POA::_narrow(obj);
//POA可移植對象適配器,適配器的作用自行理解
//POAManager適配器的管理器
PortableServer::POAManager_var mgr = poa->the_POAManager();
//激活管理器,這個操作可以在orb->run()後,及時的處理請求
mgr->activate();
//new個伺服程序對象
Time_impl time_servant;
//_this創建伺服程序的對象引用
Time_var tm = time_servant._this();
//object_to_string把伺服程序對象轉爲ior的字符串
//將此字符串打印出來,複製後當main函數的參數傳入客戶端程序
//在客戶端把ior字符串轉爲對象,就獲取到對象引用啦
CORBA::String_var str = orb->object_to_string(tm);
cout << str << endl;
orb->run();
} catch (const CORBA::Exception&) {
cerr << "exception" << endl;
return 1;
}
return 0;
}
客戶端程序:
#include <iostream.h>
#include "time.h"
int main(int argc, char* argv[])
{
try {
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
//string_to_object將傳進來的ior字符串轉爲對象引用
CORBA::Object_var obj = orb->string_to_object(argv[1]);
//CORBA::is_nil,CORBA的判空函數,一般取到對象引用後到is_nil一下
if (CORBA::is_nil(obj)) {
cerr << "Nil Time Reference" << endl;
throw 0;
}
//強轉回對象引用的原型
Time_var tm = Time::_narrow(obj);
if (CORBA::is_nil(tm)) {
cerr << "Nil Time Reference" << endl;
throw 0;
}
//調用對象引用的函數,就行調用本地函數一樣
cout << "Time is " << tm->get_gmt() << endl;
} catch (const CORBA::Exception&) {
cerr << "Exception" << endl;
return 1;
}
return 0;
}
下邊來簡單介紹一下CORBA相關的名稱,由於本人也是剛開始學習,有不足或者錯誤的地方,希望大家多多擔待。
CORBA(Common Object Request Broker Architecture)
公用對象請求代理體系
一個協議
爲可移植的、面向對象的分佈式計算應用程序提供了不依賴於平臺的編程接口和模型,不依賴於編程語言、計算平臺、網絡協議。
英文名 | CORBA(Common Object Request Broker Architecture) |
---|---|
中文名 | 公用對象請求代理體系 |
本質 | 一個協議 |
概念 | 爲可移植的、面向對象的分佈式計算應用程序提供了不依賴於平臺的編程接口和模型,不依賴於編程語言、計算平臺、網絡協議 |
作者理解 | 爲了分佈式通信定義的一個協議 |
英文名 | ORB(Object Request Broker) |
---|---|
中文名 | 對象請求代理 |
本質 | 一箇中間件 |
概念 | 在對象間建立客戶-服務器關係,在客戶機和對象間進行通信 |
作者理解 | 通過orb可以實現分佈式的客戶機與服務器之間的通信 |
英文名 | POA(Portable Object Adapter) |
---|---|
中文名 | 可移植對象適配器 |
本質 | 一個適配器 |
概念 | 負責創建對象引用;使CORBA對象與伺服程序相互對應;涉及到對象從創建到銷燬的整個生命週期的所有方面 |
作者理解 | 客戶程序發送請求——服務器ORB接收請求——發送給POA——POA創建目標對象——POA調用請求給實現目標對象的伺服程序——伺服程序執行請求——通過POA和ORB向客戶程序返回out和返回值 |
英文名 | IOR(Interoperable Object Reference) |
---|---|
中文名 | 可互操作的對象引用 |
本質 | 一個對象標識 |
概念 | 可以靈活存儲ORB間協議的信息,每個IOR包含一個主機名,TCP/IP端口號和一個對象密鑰,密鑰根據所給出的主機名和端口組合來識別目標對象 |
作者理解 | 相當於對象引用id,可以讓客戶端找到需要的對象引用。因爲客戶端會發送一個id給服務器端,服務器的POA在創建對象引用通過規則將此id嵌入到對象引用,這樣客戶端就可以找到自己調用的對象了 |
英文名 | IIOP(Internet Inter-ORB Protocol) |
---|---|
中文名 | 網絡互操作協議 |
本質 | 一個協議 |
概念 | 保證了爲不同供應商的ORB所開發的系統組件間可互操作,指定GIOP如何在TCP/IP上實現 |
英文名 | GIOP(General Inter-ORB Protocol) |
---|---|
中文名 | 通用對象請求代理間通信協議 |
本質 | 一個協議 |
概念 | 提供了一個標準傳輸語法(低層數據表示方法)和ORB之間通信的信息格式集。GIOP只能用在ORB與ORB之間,而且,只能在符合理想條件的面向連接傳輸協議中使用 |
英文名 | OMG(Object Management Group) |
---|---|
中文名 | 對象管理組 |
本質 | 一個組織 |
概念 | 基本不用思考,CORBA一定是這個組織構建的 |
立一個flag,以後會每週更新一篇,內容不限,有拖拉請後期補上,好嗎。下週可能簡介伺服程序和分佈式通信等。
排版好醜,無法忍受,需要下功夫了。