博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式rpc框架ice学习之helloworld篇
阅读量:7136 次
发布时间:2019-06-28

本文共 3410 字,大约阅读时间需要 11 分钟。

更多相关内容

官方安装文档在:

这里根据官方文档,演示在mac平台的安装教程,
使用 Homebrew直接安装如下:

brew install ice

在homebrew下载过程中,可能有些文件由于某些原因下载不下来,我这里文件mcpp-2.7.2.tar.gz就下载不了,挂上代理直接下载,然后运行命令

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++的通讯,文档地址:

第一步,编写ice的slice配置文件,如下:

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

表明Demo模块下存在一个接口Printer,提供一个操作printString

第二步,编译该文件生成对应语言源文件,c++源文件命令如下:

slice2cpp Printer.ice

会生成两个c++文件,如下:

Printer.cpp  Printer.h

然后编写服务端,命名为Server.cpp,代码如下:

#include 
#include
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功能很简单,直接输出参数内容。

编译命令如下:

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

会生成server二进制文件服务端,运行./server命令即可监听本地10000 端口。

第三步,编写客户端。
c++客户端代码如下:

#include 
#include
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.cppc++ -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如下:

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/是我本机地址。

转载地址:http://uytrl.baihongyu.com/

你可能感兴趣的文章
ubuntu13.04 编译环境
查看>>
**Git中的AutoCRLF与SafeCRLF换行符问题
查看>>
heibernate增删改查总结一下自己的不足
查看>>
Git使用教程及常用命令大全
查看>>
数据持久化-- json、pickle
查看>>
更适用于JavaScript的设计模式:面向委托的设计,了解一下?(上)
查看>>
Android布局文件layout.xml的一些属性值
查看>>
谁说Vim不是IDE?(二)
查看>>
ER-Studio的五种关系说明
查看>>
三种new
查看>>
多项式与三角函数求导——BUAA OO 第一单元作业总结
查看>>
VsCode 格式化插件配置
查看>>
JAVA 23种开发模式详解(代码举例)
查看>>
Windows上搭建Flume运行环境
查看>>
Linux系统排查4——网络篇
查看>>
文件操作
查看>>
Python基本语法_异常处理详解
查看>>
3.6链表应用--基于链表实现栈
查看>>
1F - A+B for Input-Output Practice (III)
查看>>
常用IIS mime类型
查看>>