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