分佈式rpc框架ice學習之helloworld篇

更多相關內容 http://www.codefrom.com/php

官方安裝文檔在:https://zeroc.com/download.html
這裏根據官方文檔,演示在mac平臺的安裝教程,
使用 Homebrew直接安裝以下:html

brew install ice

在homebrew下載過程當中,可能有些文件因爲某些緣由下載不下來,我這裏文件mcpp-2.7.2.tar.gz就下載不了,掛上代理直接下載,而後運行命令c++

sudo cp -f ~/Downloads/mcpp-2.7.2.tar.gz /Library/Caches/Homebrew/mcpp-2.7.2.tar.gz

一樣的方法,其餘不能下載的也能夠經過掛代理下載後拷貝到對應的地方完成安裝。
安裝好了,個人mac會自動在/usr/local/Cellar/ice/3.5.1_1/
目錄下(版本3.5)有相應的編譯須要的頭文件。
在這裏根據官方的文檔進行php和c++的通信,文檔地址:https://doc.zeroc.com/pages/viewpage.action?pageId=14030991ui

第一步,編寫ice的slice配置文件,以下:spa

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

代表Demo模塊下存在一個接口Printer,提供一個操做printString
第二步,編譯該文件生成對應語言源文件,c++源文件命令以下:代理

slice2cpp Printer.ice

會生成兩個c++文件,以下:code

Printer.cpp  Printer.h

而後編寫服務端,命名爲Server.cpp,代碼以下:server

#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;
}
服務端實現的printString功能很簡單,直接輸出參數內容。

編譯命令以下:htm

c++ -I. -I/usr/local/Cellar/ice/3.5.1_1/include -c Printer.cpp Server.cpp
c++ -o server Printer.o Server.o -L/usr/local/Cellar/ice/3.5.1_1/lib -lIce -lIceUtil

會生成server二進制文件服務端,運行./server命令便可監聽本地10000 端口。
第三步,編寫客戶端。
c++客戶端代碼以下:blog

#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;
}

客戶端調用printString方法傳入參數爲"Hello World!",編譯命令同理以下:

c++ -I. -I/usr/local/Cellar/ice/3.5.1_1/include -c Printer.cpp Client.cpp
c++ -o client Printer.o Client.o -L/usr/local/Cellar/ice/3.5.1_1/lib -lIce -lIceUtil

運行生成的client二進制文件,./client能夠看到server端顯示以下:

能夠看到客戶端調用printer的接口printString成功
下面演示php的客戶端代碼編寫。首先運行命令

slice2php Printer.ice

會在當前目錄下生成Printer.php,而後編寫客戶端代碼client.php以下:

<?php
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . '/usr/local/Cellar/ice/3.5.1_1/php/');
require 'Ice.php';
require 'Printer.php';

$ic = null;
try
{
    $ic = Ice_initialize();
    $base = $ic->stringToProxy("SimplePrinter:default -p 10000");
    $printer = Demo_PrinterPrxHelper::checkedCast($base);
    if(!$printer)
        throw new RuntimeException("Invalid proxy");

    $printer->printString("Hello World!");
}catch(Exception $ex){
}

直接調用php client.php一樣能夠看到服務端顯示"Hello World!"
由此,能夠看到,利用ice,php成功調用了c++實現的Printer接口的printString方法。
注:/usr/local/Cellar/ice/3.5.1_1/是我本機地址。

相關文章
相關標籤/搜索