1. 程式人生 > >ICE介紹及例項

ICE介紹及例項

Ice-Internet Communications Engine,是一種面向物件、跨平臺、多語言的通訊中介軟體。支援C++、Java、C#、VB、Python等,客戶和伺服器可以用不同的語言,可以執行在不同的作業系統和機器架構上,支援TCP/UDP。

Ice應用組成:

Ice物件——Ice物件是在本地或遠地的地址空間中、能響應客戶請求的實體。先由Slice定義,然後編譯成特定語言版本;每個Ice物件有多個介面,支援特定操作,客戶通過呼叫它的介面來發出請求;每個物件有唯一的物件標識。

Servants——伺服器端編寫的類例項,體現Ice物件行為。

代理(Proxies)——代理是Ice物件在客戶端的代表,客戶呼叫代理上的操作來獲得服務端上Ice物件提供的服務。

通訊器(Ice::Communicator)——通訊時,伺服器和客戶建立一個通訊器,為通訊程序分配和管理資源,是雙方通訊的專用線路。

物件介面卡(object adapter)——專用於伺服器端的Ice API,把Ice run time與服務端編寫的Servant類連線在一起。每個介面卡繫結一個埠。

Ice應用的結構如下:


Slice

Slice (Specification Language for Ice, Ice規範語言),用於物件介面定義與實現相分離的基礎性抽象機制,可以把定義好的Ice物件對映成特定語言。

Slice開發過程見下圖:

相同開發環境


不同開發環境:


Ice應用開發過程:

1. 定義Ice物件(Printer.ice)

module Demo{
 interface Printer{
 void printString(string s);
 };
}


2. 編譯成C++

slice2cpp Printer.ice

獲得Printer.h/Printer.cpp

3.服務端使用C++實現Ice物件(Servant類)

#include <Ice/Ice.h>
#include <Printer.h>
using namespace std;
using namespace Demo;
class PrinterI:public Printer{
public:
   virtual void printString(const string& s,const Ice::Current&);
};
void PrinterI::printString(const string& s, const Ice::Currrent&){
cout<<s<<endl;
}

4.服務端編寫

Ice::CommunicatorPtr ic;
//建立通訊器
ic=Ice::initialize(argc, argv);
//建立物件介面卡,繫結埠
Ice::ObjectAdapterPtr adapter=ic->createObjectAdapterWithEndpoints(
		"simplePrinterAdapter","default -p 10000");
Ice::ObjectPtr object = new PrinterI;
//加入Ice物件例項,指定識別符號
adapter->add(object,ic->stringToIdentity("SimplePrinter"));
//啟動介面卡
adapter->activate();
//掛起該程序
ic->waitForShutdown();

5.客戶編寫

#include <Ice/Ice.h>
#include <Printer.h>
using namespace std;
using namespace Demo;
Ice::CommunicatorPtr ic;
//建立通訊器
ic = Ice::initialize(argc, argv);
//獲得Ice物件代理,SimplePrinter-物件識別符號,default -p 10000-協議與埠
Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
//向下轉換
PrinterPrx printer = PrinterPrx::checkedCast(base);
if (!printer) throw "Invalid proxy";
//呼叫操作
printer->printString("Hello World!");


6.編譯

//服務端
c++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp
c++ -o server Printer.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil
//客戶端
c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp
c++ -o client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil


7.執行

伺服器端./server,客戶端./client