Ice筆記 服務端的Slice to C

2021-08-26 03:57:35 字數 3520 閱讀 8614

初始化和結束伺服器端ice run time的實現可分為三種方式:常用main函式實現,利用

類實現,利用ice::service類等。

ice run time 的主要進入點是由本地介面ice::communicator表示,在程式的開始必須首先呼叫ice::initialize對ice run time 進行初始化;ice::communicator返回乙個智慧型指標,指向乙個 ice::communicator例項。

初始化的**在服務端main函式實現大致如:ice::

communicatorptr

ic = ice::initialize(argc , argv);。如果在初始化過程中出了任何問題,ice::initialize 會丟擲異常。

在離開main函式之前,必須呼叫communicator::destroy來結束ice run time 。 destroy會等待任何正在執行的操作呼叫完成;如果在呼叫destroy函式之前就終止main函式,會導致不確定的後果。

#include int main(int argc, char * argv)

catch (const ice::exception & e) catch (const std::string & msg) catch (const char * msg)

if (ic)

return status;

}

namespace ice

;}

其程式**的實現大致如下:

public:

virtual int run(int, char * )

}; int main(int argc, char * argv)

這裡不再詳細介紹ice::service。詳細資料可以參考 《ice-1.3.0_cn.pdf》第10章中的內容。

在客戶端,介面對映到**類(參見5.12 節)。在伺服器端,介面對映到骨架類。對於相應的介面上的每個操作,骨架類都有乙個對應的純虛方法。

例如,有乙個node介面的定義:

module filesystem

; // ...

};

slice 編譯器為這個介面生成這樣的定義:

namespace filesystem

; // ...

}

下面是骨架類的幾點特性:

• 和客戶端一樣,slice 模組對映到名字相同的c++ 名字空間,所以骨架類定義會放在名字空間filesystem 中。

• 骨架類的名字與slice 介面的名字(node)相同。

• 對於slice 介面中的每個操作,骨架類都有乙個對應的純虛成員函式。

• 骨架類是抽象基類,因為它的成員函式是純虛函式。

• 骨架類繼承自ice::object (這個類形成了ice 物件層次的根)。

要給ice 物件提供實現,我們必須建立servant 類,繼承對應的骨架類。例

如,要為node 介面建立servant,可以編寫:

#include // slice-generated header

class nodei : public virtual filesystem::node

;

首先在堆上建立乙個顯得nodei例項,把它的位址賦值給型別為

nodeiptr

的智慧型指標:

typedef iceutil::handlenodeiptr; 

nodeiptr servant = new nodei("fred");

使用智慧型指標的好處是避免偶然發生記憶體洩露。

每乙個ice物件都需要乙個標識。在使用同乙個物件介面卡的所有servant中,該標識必須是唯一的。ice 物件標識是一種結構,下面是它的slice 定義:

module ice;   

// ...

};

2.3)啟用servant

只有在你顯式地把servant 告知物件介面卡之後, ice run time 才會知道這個servant 的存在。要啟用servant,就要呼叫物件介面卡的add 操作:

void activateservant(const string & name) // refcount == 1
呼叫物件介面卡的add 操作,會把servant 指標和servant 的標識增加到介面卡的servant 對映表中,並把「ice 物件的**」與「伺服器記憶體中的正確的servant 例項」鏈結在一起。

同時ice也提供了addwithuuid()函式,只要一步,就可以生成乙個uuid、並把servant 增加到servant 對映表中。這樣就避免了額外建立標識的操作。重寫上面的函式

void activateservant(const string & name)
一旦我們啟用了ice 物件的servant,伺服器就可以處理針對這個物件的客戶請求了。但是,只有擁有了物件的**,客戶才能訪問該物件。

而象介面卡含有建立**所需的全部詳細資料:定址資訊和協議資訊,還有物件標識。物件介面卡的add 和addwithuuid servant 啟用操作會返回對應的ice 對

象的乙個**。這意味著,我們可以編寫:

typedef iceutil::handlenodeiptr;

nodeiptr servant = new nodei(name);

nodeprx proxy = nodeprx::uncheckedcast(_adapter->addwithuuid(servant));

// pass proxy to client...

在此我們需要使用uncheckedcast,因為addwithuuid 返回的**的型別是ice::

objectprx

。 伺服器端的引數傳遞所遵循的規則和客戶端一樣:

• in 引數通過值或const 引用傳遞。

• out 引數通過引用傳遞。

• 返回值通過值傳遞。

例子說明:

inte***ce example

;

為這個介面生成的骨架類:

class example : virtual public ::ice::object

;

要從操作實現中丟擲異常,你只需例項化異常,初始化,然後丟擲它。例如:

void filesystem::filei::write(const filesystem::lines & text,const ice::current &)

};

HTTP服務端JSON服務端

最後更新日期 2014 5 18 author kagula 內容簡介 cppcms是個開源web開發框架,通過它可以很容易實現http服務和json服務,這裡介紹cppcms開發環境的搭建。寫乙個cppcms測試程式,它建立http服務,向瀏覽器返回hello,world頁面。cppcms依賴的一...

APP的服務端

本文主要內容包括 1.緊密耦合 無線介面和web應用緊耦合,web端的修改會影響無線介面,web端的發布導致無線介面被動連帶發布,web端的bug影響無線介面的可用性,反過來也一樣,無線介面的任何變化會影響web應用。2.重複開發 3.穩定性 圖二 系統拆分示意 1.對等隔離 2.統一服務 adap...

服務端系統

1.高可用 容錯和降級。容錯級別上,忽略次要 error 服務降級 程式中部分error是可以忽略處理的,或者打個日誌標記下,而不用結束整個執行流程。服務降級是指,當依賴的非核心模組出問題時,可以選擇不請求或者熔斷式請求 過載保護 資料可以不吐給客戶端,這就要求對資料或者服務進行級別劃分,優先保證使...