ICE Service使用方法簡(jiǎn)介
最近研究了一下網(wǎng)絡(luò)通信中間件ICE的使用,粗通其皮毛,按照官方手冊(cè)依葫蘆畫瓢寫了一個(gè)程序員都喜聞樂(lè)見(jiàn)的“Hello World”程序,服務(wù)端和客戶端均用C++開發(fā),通訊協(xié)議使用默認(rèn)的TCP。感覺(jué)ICE的大致好處有以下兩點(diǎn):
1. 平臺(tái)無(wú)關(guān)性。無(wú)論客戶端或者服務(wù)端均可用現(xiàn)在流行的開發(fā)語(yǔ)言(C++ /JAVA/C#/php)進(jìn)行開發(fā),并且屏蔽語(yǔ)言差異性。現(xiàn)在比較流行的方式是客戶端用C#開發(fā),與用C++開發(fā)的服務(wù)端直接通訊。
2. 通訊協(xié)議多樣性。現(xiàn)在可選擇TCP、UDP、HTTP進(jìn)行通訊,如果對(duì)安全要求較高,可選擇SSL對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密。
另外ICE還提供一些擴(kuò)展組件,實(shí)現(xiàn)網(wǎng)絡(luò)通訊的負(fù)載均衡(ICEGrid),通訊節(jié)點(diǎn)統(tǒng)一管理(ICEBOX),程序自動(dòng)更新(ICEPatch)等,方便應(yīng)用擴(kuò)展。
如果使用過(guò)ICE的人都知道,在實(shí)現(xiàn)服務(wù)端或者客戶端的時(shí)候通常都要寫一些“公式化”的代碼,負(fù)責(zé)Ice通信器初始化、異常捕獲,以及應(yīng)用終止后的銷毀。如下所示:
1
int status=0;
2
3
Ice::CommunicatorPtr ic;
4
5
try
6
7
{
8
9
ic = Ice::initialize(argc,argv);
10
11
Ice::ObjectAdapterPtr adapter =
12
13
ic->createObjectAdapterWithEndpoints("SayHelloAdapter","tcp -h 127.0.0.1 -p 10000");
14
15
Ice::ObjectPtr object = new HelloICEI;
16
17
adapter->add(object,ic->stringToIdentity("SimpleHello"));
18
19
adapter->activate();
20
21
ic->waitForShutdown();
22
23
}
24
25
catch (const Ice::Exception & e)
26
27
{
28
29
cerr << e << endl;
30
31
status = 1;
32
33
}
34
35
catch (const char * msg)
36
37
{
38
39
cerr << msg << endl;
40
41
status = 1;
42
43
}
44
45
if ( ic )
46
47
{
48
49
try
50
51
{
52
53
ic->destroy();//關(guān)閉ICE
54
55
}
56
57
catch (const Ice::Exception & e)
58
59
{
60
61
cerr << e << endl;
62
63
status = 1;
64
65
}
66
67
}
68
69
如果每次都要寫這么多的話,第一浪費(fèi)時(shí)間和精力,第二不能將注意力集中到業(yè)務(wù)邏輯上。還有一點(diǎn)就是對(duì)代碼的整潔和易讀方面做的不夠好(本人略微有些代碼“潔癖”)。
閱讀官方手冊(cè),發(fā)現(xiàn)ICE提供兩個(gè)工具類封裝了這些“公式化”邏輯,分別是“Application”和“Service”。
Ice::Application本身是一個(gè)抽象類,其run()函數(shù)為純虛函數(shù),因此必須被繼承后使用。
Ice::Application 是一個(gè)單體(singleton)類,會(huì)創(chuàng)建單個(gè)通信器。如果你要使用多個(gè)通信器,不能使用Ice::Application來(lái)定義多個(gè)App。而至多定義一個(gè)App的實(shí)例。
其它通信器需要使用Ice::initialize()手工生成。
一般而言,Ice::Application 類對(duì)于Ice 客戶和服務(wù)器來(lái)說(shuō)已經(jīng)非常方便,但在有些情況下,應(yīng)用可能需要作為Unix 看守(daemon)或Win32 服務(wù)運(yùn)行在系統(tǒng)一級(jí)。對(duì)于這樣的情況,Ice 提供了Ice::Service。一個(gè)可與Ice::Application 相比的單體類,但它還封裝了低級(jí)的、 針對(duì)特定平臺(tái)的初始化和關(guān)閉步驟――系統(tǒng)服務(wù)常常需要使用這樣的步驟。
下面介紹Ice::Service的使用方法,僅介紹開發(fā)步驟,后面附上具體例子下載。
1. 需要在服務(wù)端中引用Ice/Service.h頭文件。本人曾在此浪費(fèi)了2個(gè)小時(shí)。
2. 新建一個(gè)類繼承Ice::Service,并實(shí)現(xiàn)其中的三個(gè)虛函數(shù)。代碼如下:
1
class MyService : public Ice::Service
2
3

{
4
5
protected:
6
7
virtual bool start(int, char *[],int&);
8
9
virtual bool stop();
10
11
virtual void interrupt();
12
13
private:
14
15
Ice::ObjectAdapterPtr m_adapter;
16
17
};
18
19
void MyService::interrupt()
20
21

{
22
23
std::cout << "Receive signal
" << std::endl;
24
25
Ice::Service::interrupt();
26
27
}
28
29
bool MyService::stop()
30
31

{
32
33
std::cout << "Stop running
" << std::endl;
34
35
return true;
36
37
}
38
39
bool MyService::start(int argc, char * argv[],int& status)
40
41

{
42
43
std::string endpoint = "tcp -h localhost -p 10000";
44
45
m_adapter = communicator()->createObjectAdapterWi thEndpoints("SimpleHelloAdapter", endpoint);
46
47
Ice::ObjectPtr object = new HelloICEI;
48
49
m_adapter->add(object,communicator()->stringToIdentity("SimpleHello"));
50
51
m_adapter->activate();
52
53
return true;
54
55
}
56
57
3. 在main函數(shù)中啟動(dòng)服務(wù)。此處需要注意對(duì)于服務(wù)來(lái)說(shuō)最常見(jiàn)的有安裝服務(wù)、卸載服務(wù)、啟動(dòng)服務(wù)、停止服務(wù)四個(gè)操作。這四個(gè)操作分別通過(guò)啟動(dòng)參數(shù)來(lái)控制。以Win32平臺(tái)為例:
--service NAME
作為名叫NAME 的Windows 服務(wù)啟動(dòng)。在傳給start 成員函數(shù)的參數(shù)向量中,這個(gè)選項(xiàng)會(huì)被移除。
但是,在應(yīng)用作為Windows 服務(wù)運(yùn)行之前,它必須先被安裝,因此,Ice::Service 類還支持另外一些的命令行選項(xiàng),用于執(zhí)行管理活動(dòng):
--install NAME [--display DISP] [--executable EXEC][ARG ...]
安裝NAME 服務(wù)。如果指定了--display 選項(xiàng),就把DISP 用作服務(wù)的顯示名,否則就使用NAME。如果指定了--executable 選項(xiàng),就把EXEC 用作服務(wù)的可執(zhí)行路徑名,否則就使用可執(zhí)行文件的路徑名來(lái)調(diào)用--install。其他任何參數(shù)都會(huì)不加改變地傳給Service::start 成員函數(shù)。注意,在啟動(dòng)時(shí)傳給服務(wù)的參數(shù)集中,這個(gè)命令會(huì)自動(dòng)增加命令行參數(shù)--service NAME,因此,你不需要顯式地指定這些選項(xiàng)。
--uninstall NAME
移除NAME 服務(wù)。如果服務(wù)目前是活動(dòng)的,在反安裝之前,必須先使它停止。
--start NAME [ARG ...]
啟動(dòng)NAME 服務(wù)。其他任何參數(shù)都會(huì)不加改變地傳給Service::start 成員函數(shù)。
--stop NAME
停止NAME 服務(wù)。如果指定的管理命令不止一個(gè),或者在使用--service 的同時(shí)還使用了管理命令,就會(huì)發(fā)生錯(cuò)誤。在執(zhí)行了管理命令之后,程序會(huì)立即終止。Ice::Service 類支持Windows 服務(wù)控制代碼SERVICE_CONTROL_INTERROGATE 和SERVICE_CONTROL_STOP。在收到SERVICE_CONTROL_STOP 時(shí),Ice::Service 會(huì)調(diào)用shutdown 成員函數(shù)。
在Visual Studio中設(shè)置啟動(dòng)參數(shù)—install MyService,可在系統(tǒng)服務(wù)中注冊(cè)名為“MyService”的服務(wù)。
啟動(dòng)服務(wù)端程序可以在系統(tǒng)服務(wù)列表中看到MyService已經(jīng)作為服務(wù)注冊(cè)進(jìn)去了。
4. 至此ICE的服務(wù)端即可作為系統(tǒng)服務(wù)的形式存在與客戶端進(jìn)行通訊了。
示例代碼下載
posted on 2011-07-10 13:10
三夏健 閱讀(1978)
評(píng)論(3) 編輯 收藏 引用 所屬分類:
ICE