(6)最簡單的ICE例子

簡述

例子雖然短小,但是基本上反映了ICE對分佈式系統建模的思想和方法。結合以上6篇文章,應該就能夠輕鬆邁入ICE框架學習的大門,比起買《zero ice權威指南》那本坑人的書要好的多。

協議

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

客戶端

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

using namespace std; 
using namespace Demo;

int main(int argc, char * argv[]) 
{
    try
    {
        //
        Ice::CommunicatorHolder icHolder = Ice::initialize(argc, argv);

        //Ice::ObjectPrx就是Ice對象的代理。下面這個是直接代理,代理的目標對象在端點(endpoint)"localhost:10000"上。
        Ice::ObjectPrx base = icHolder->stringToProxy("SimplePrinter:default -h localhost -p
    10000");

        //由於Ice::ObjectPrx抽象層次太高,需要將其向下轉化到該目標對象的具體代理實現PrinterPrx
        PrinterPrx printer = PrinterPrx::checkedCast(base);
        if(!printer)
        {
            throw std::runtime_error("Invalid proxy");
        }

        //通過代理,現在就可以對目標對象進行訪問
        printer->printString("Hello World!");
    }
    catch(const std::exception& ex)
    {
        cerr << ex.what() << endl;
        return 1;
    }
    return 0; 
}

服務端

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

using namespace std;
using namespace Demo;

//PrintI就是ICE服務員
class PrinterI : public Printer
{
public:
    virtual void printString(const string &, const Ice::Current&);
};

void PrinterI::printString(const string &s, const Ice::Current&)
{
    cout << s << endl;
}

int main(int argc, char* argv[])
{
    try
    {

        Ice::CommunicatorHolder icHolder = Ice::initialize(argc, argv);

        //Ice::ObjectAdapterPtr就是ICE適配器。適配器首先要綁定端點(endpoint),端點地址爲"localhost:10000"
        Ice::ObjectAdapterPtr adapter = icHolder->createObjectAdapterWithEndpoints("SimplePrinterAdapter", 
            "default -h localhost -p 10000");

        //接下來,適配器把ICE服務員和ICE對象綁定起來
        Ice::ObjectPtr object = new PrinterI;
        adapter->add(object, icHolder->stringToIdentity("SimplePrinter"));

        //適配器激活以後就開始工作啦
        adapter->activate();

        icHolder->waitForShutdown();
    }
    catch(const std::exception& e)
    {
        cerr << e.what() << endl;
        return 1;
    }
    return 0;
}

參考

更多的demo地址參考ICE在github上的主頁

發佈了31 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章