zeroc ice 客戶端與服務端通訊例子(c++)

launch_225發表於2017-07-06

zeroc ice 客戶端與服務端通訊例子(c++)

參考 :http://blog.csdn.net/qingen1/article/details/13052139 以及官方文件【Ice 分散式程式設計】


export ICE_HOME=/usr


1. Printer.ice

[root@linuxice ~]# cat Printer.ice
module Demo
{
interface Printer
{
void printString(string s);
};
};


2. slice2cpp Printer.ice

生成檔案:Printer.cpp   Printer.h


3. Server.cpp

[root@linuxice ~]# cat 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,Ice::stringToIdentity("SimplePrinter"));
        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)
ic->destroy();
return status;
}

4. 編譯服務端程式碼。在編譯和連線時需要指定ICE標頭檔案和動態連結庫的位置

c++  -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp
c++  -o server Printer.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil


[root@linuxice ~]# c++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp
[root@linuxice ~]#
[root@linuxice ~]#
[root@linuxice ~]#
[root@linuxice ~]# ls -tl |head
total 512
-rw-r--r--  1 root root  62640 Jul  6 13:46 Server.o
-rw-r--r--  1 root root 291472 Jul  6 13:46 Printer.o

-rw-r--r--  1 root root    901 Jul  6 13:46 Server.cpp
-rw-r--r--  1 root root  10235 Jul  6 11:55 Printer.cpp


[root@linuxice ~]# c++ -o server Printer.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil
[root@linuxice ~]#
[root@linuxice ~]# ls -tl |head
total 704
-rwxr-xr-x  1 root root 193708 Jul  6 13:50 server
-rw-r--r--  1 root root  62640 Jul  6 13:46 Server.o
-rw-r--r--  1 root root 291472 Jul  6 13:46 Printer.o
-rw-r--r--  1 root root    901 Jul  6 13:46 Server.cpp
-rw-r--r--  1 root root  10235 Jul  6 11:55 Printer.cpp

5. Client.cpp檔案

#include <Ice/Ice.h>
#include <Printer.h>

using namespace std;
using namespace Demo;

// 客戶端只需要一個main函式,並且程式碼結構與服務端程式碼類似
int main(int argc, char* argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try {
// 初始化ICE執行時
ic = Ice::initialize(argc, argv);


//ObjectPrx 在客戶端代理伺服器端
Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:tcp -p 10000");
PrinterPrx printer =PrinterPrx::checkedCast(base);
if (!printer)
throw "Invalid proxy";
// 呼叫Printer物件代理的printString方法。呼叫將會通過物件代理被髮送到服務端
printer->printString("HelloWorld!");
} 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;
}


同上邊的執行內容 :

c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp
c++ -o  client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil


 [root@linuxice ~]# c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp
[root@linuxice ~]#
[root@linuxice ~]# ls -tl |head
total 776
-rw-r--r--  1 root root  64600 Jul  6 14:12 Client.o
-rw-r--r--  1 root root 291472 Jul  6 14:12 Printer.o
-rw-r--r--  1 root root    827 Jul  6 14:10 Client.cpp
drwxr-xr-x  2 root root   4096 Jul  6 13:56 cl
-rwxr-xr-x  1 root root 193708 Jul  6 13:50 server
-rw-r--r--  1 root root  62640 Jul  6 13:46 Server.o
-rw-r--r--  1 root root    901 Jul  6 13:46 Server.cpp
-rw-r--r--  1 root root  10235 Jul  6 11:55 Printer.cpp
-rw-r--r--  1 root root  17540 Jul  6 11:55 Printer.h




c++ -o  client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil

[root@linuxice ~]# ls -tl |head
total 964
-rwxr-xr-x  1 root root 190836 Jul  6 14:14 client
-rw-r--r--  1 root root  64600 Jul  6 14:12 Client.o
-rw-r--r--  1 root root 291472 Jul  6 14:12 Printer.o
-rw-r--r--  1 root root    827 Jul  6 14:10 Client.cpp
drwxr-xr-x  2 root root   4096 Jul  6 13:56 cl
-rwxr-xr-x  1 root root 193708 Jul  6 13:50 server
-rw-r--r--  1 root root  62640 Jul  6 13:46 Server.o
-rw-r--r--  1 root root    901 Jul  6 13:46 Server.cpp
-rw-r--r--  1 root root  10235 Jul  6 11:55 Printer.cpp

6. 驗證

crt視窗1執行:

[root@linuxice ~]# ./server

crt視窗2執行:

[root@linuxice ~]# ./client


crt視窗1顯示:

[root@linuxice ~]# ./server
HelloWorld!


備註:之前的過程 的通訊方式和細的東西再體會。




相關文章