背景
本文檔介紹在unbuntu環境下如何安裝ICE,並用C++寫一個ICE應用html
ICE簡介
ICE是ZEROC的開源通訊協議產品,它的全稱是:The Internet Communications Engine,翻譯爲中文是互聯網通訊引擎,是一個流行的面向對象的工具包,使咱們可以以最小的代價構建分佈式應用程序。ICE使咱們專一於應用邏輯的開發,它來處理全部底層的網絡接口編程,這樣咱們就不用去考慮這樣的細節:打開網絡鏈接、網絡數據傳輸的序列化與反序列化、鏈接失敗的嘗試次數等。c++
第一部分
下載
源碼下載連接:戳這裏
git
編譯安裝
tar zxvf ice-3.6.0.tar.gz
cd ice-3.6.0/cpp
make
make installgithub
所遇到的問題&解決方法
1)ConnectionI.cpp:28:19: error: bzlib.h: 沒有那個文件或目錄
sudo apt-get install libmcpp-dev編程
2)../Freeze/TransactionI.h:15:20: error: db_cxx.h: 沒有那個文件或目錄
安裝Berkeley DB,具體可參考:戳這裏
BDB環境配置:
export DB_HOME=/usr/local/BerkeleyDB.4.6
PATH=$PATH:$DB_HOME/bin
. .bashrcbash
第二部分
1.建立ICE文件Printer.ice網絡
module Demo { interface Printer { void printString(string s); }; };
2.Compiling a Slice Definition for C++
$ slice2cpp Printer.ice分佈式
3.建立Server.cpp工具
#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::Current&) { cout << s << endl; } int main(int argc, char* argv[]) { int status = 0; Ice::CommunicatorPtr ic; try { ic = Ice::initialize(argc, argv); Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000"); Ice::ObjectPtr object = new PrinterI; adapter->add(object, ic->stringToIdentity("SimplePrinter")); adapter->activate(); ic->waitForShutdown(); } catch (const Ice::Exception& e) { cerr << e << endl; status = 1; } catch (const char* msg) { cerr << msg << endl; status = 1; } if (ic) { try { ic->destroy(); } catch (const Ice::Exception& e) { cerr << e << endl; status = 1; } } return status; }
4.建立Client.cpp測試
#include <Ice/Ice.h> #include <Printer.h> using namespace std; using namespace Demo; int main(int argc, char* argv[]) { int status = 0; Ice::CommunicatorPtr ic; try { ic = Ice::initialize(argc, argv); Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000"); PrinterPrx printer = PrinterPrx::checkedCast(base); if (!printer) throw "Invalid proxy"; printer->printString("Hello World!"); } catch (const Ice::Exception& ex) { cerr << ex << endl; status = 1; } catch (const char* msg) { cerr << msg << endl; status = 1; } if (ic) ic->destroy(); return status; }
5.測試
1.環境配置
export ICE_HOME=/opt/Ice-3.6.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DB_HOME/lib64:/home/bran/ice-3.6.0/cpp
$ c++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp
$ c++ -o server Printer.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil -lpthread
$ c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp$ c++ -o client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil -lpthread