ICE第二篇--一个"hello world"的简单例子
1 本文介绍一个hello world输出的例子。
ice应用的步骤如下:
1. 编写 Slice 定义并编译它。
2. 编写服务器并编译它。
3. 编写客户并编译它。
基本框架图示:
本文代码图示:
需要注意的概念:
servant
servant其实是服务端实质的动作代码.一个servant 提供一个或多个Ice 对象的实质内容。实际上,servant 就是服务器开发者编写的类的实例,
对象适配器 是对象(或者说是servant)的代理。(1)包含端点地址和对象。适配器和端点地址绑定,对象是注册到对象适配器中的。(2) 只有间接代理时候,客户端才用到适配器
服务端就是 建立适配器,把对象(servant)注册进适配器的过程
客户端就是 连接适配器,获得对象(servant) 的过程
2 我们需要3个程序.
2.1 编写 Slice 定义
编写任何 Ice 应用的第一步都是要编写一个 Slice 定义,其中含有应用所用的各个接口。
module demo
{
interface Printer
{
void printString(string s);
}
};
我们把这段文本保存在叫作 Printer.ice 的文件中。
我们的 Slice 定义含有一个接口,叫作 Printer。目前,我们的接口非常简单,只提供了一个操作,叫作 printString。 printString 操作接受一个
串作为它唯一的输入参数;这个串的文本将会出现在 (可能在远地的)打印机上。
要创建我们的 C++ 应用,第一步是要编译我们的 Slice 定义,生成 C++
代理和骨架。在 UNIX 上,你可以这样编译定义:
$ slice2cpp Printer.ice
slice2cpp 编译器根据这个定义生成两个 C++ 源文件:Printer.h 和Printer.cpp。
• Printer.h
Printer.h 头文件含有与我们的 Printer 接口的 Slice 定义相对应的C++ 类型定义。在客户和服务器源码中必须包括这个头文件。
• Printer.cpp
Printer.cpp 文件含有我们的 Printer 接口的源码。所生成的源码同时为客户和服务器提供针对特定类型的运行时支持。例如,它包含了
在客户端整编参数数据 (传给 printString 操作的串)的代码,以及在服务器端解编数据的代码。我们必须编译 Printer.cpp 文件,并把它链接进客户和服务器。
2 编写和编译服务器
总结服务端代码流程:
建立适配器,建立servant。适配器和servant绑定。激活ice通信器
服务器的源码不多,下面给出了其完整代码:
#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 &);
};//继承自slice提供了接口
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;//创建一个servant,其实就是服务器对象的实质处理函数
adapter->add(object,ic->stringToIdentity("SimplePrinter"));适配器与servant绑定。括号内是servant和servant名字 或者说 把服务端对象注册进适配器中
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;
}
$ g++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp
c++ -o server Printer.o Server.o \ -L$ICE_HOME/lib -lIce -lIceUtil
3 客户端程序
总结客户端代码流程:
使用servant名称和适配器地址建立代理,代理转换为继承类的servant
#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;
}
stringToProxy 返回的代理的类型是 Ice::ObjectPrx,这种类型位于接口和类的继承树的根部。但要实际与我们的打印机交谈,我们需
要的是 Printer 接口、而不是 Object 接口的代理。为此,我们需要调用 PrinterPrx::checkedCast 进行向下转换。这个方法会发送一
条消息给服务器,实际询问 “这是 Printer 接口的代理吗?”如果是,这个调用就会返回 Printer 的一个代理;如果代理代表的是其他类型的
接口,这个调用就会返回一个空代理。
客户的编译和链接看起来与服务器很像:
$ c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp
$ c++ -o client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil
4 运行客户和服务器
要运行客户和服务器,我们首先要在一个单独的窗口中启动服务器:
$ ./server
我们在这时不会看到任何东西,因为服务器会简单地等待客户与它连
接。我们在另外一个窗口中运行客户:
$ ./client
$
客户会运行并退出,不产生任何输出;但在服务器窗口中,我们会看到
打印机产生的 "Hello World!"。要终止服务器,我们目前的做法是在命
令行上中断它 (我们将在 10.3.1 节看到更干净的服务器终止方式)
。
本文主要内容来自《ice分布式设计》
ICE第二篇--一个"hello world"的简单例子的更多相关文章
- 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)
原文地址:http://blog.csdn.net/yeohcooller/article/details/9316923 读博文前应该注意: 本文提纲:本文通过一个用户注册的实例讲解SSH的整合.创 ...
- WebRTC:一个视频聊天的简单例子
相关API简介 在前面的章节中,已经对WebRTC相关的重要知识点进行了介绍,包括涉及的网络协议.会话描述协议.如何进行网络穿透等,剩下的就是WebRTC的API了. WebRTC通信相关的API非常 ...
- gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第二篇:gradle简单实战
一个bug 一个脚印的叫你们用gradle. 1介于网络上的很多资料都是老的 不适用与现在的新版本gradle 尤其是有些gradle方法改名了老的用不了 2介于网上都是粘贴复制并且零碎我很蛋疼啊,走 ...
- JavaWeb学习总结第二篇--第一个JavaWeb程序
JavaWeb学习总结第二篇—第一个JavaWeb程序 最近我在学院工作室学习并加入到研究生的项目中,在学长学姐的带领下,进入项目实践中,为该项目实现一个框架(用已有框架进行改写).于是我在这里记录下 ...
- 开博第二篇:记一个利用JavaScript,编写PS脚本,开发图片量产工具
背景:身在一个有实业的电商公司,设计部的妹子们总是会有做不完的商品图片,当然了,要是做点有技术含量的美化工作也罢,但是最近她们很是无聊,总是要做一些重复性的工作,就比如如题所说的,图片量产,量产什么呢 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
原文地址: http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...
- 深入理解javascript对象系列第二篇——属性操作
× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...
随机推荐
- 修改某个UITextField的键盘的返回键类型以及监听键盘的高度变化,取到键盘动画退出弹出的时间,一起随着键盘顶出来或者压下去,
1.修改某个UITextField的键盘的返回键类型: [_bottomTextView setReturnKeyType:UIReturnKeyDone]; 1.1.textFied点击return ...
- redis学习一
一.简介: 在过去的几年中,NoSQL数据库一度成为高并发.海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机.然而在众多产品中能够脱颖而出的却屈指可数,如Redis.MongoDB ...
- Linux系统查看有几块硬盘
使用df命令即可查看.df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置: 示例:[root@localhost ~]# d ...
- 转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户
但凡是学过Oracle的同学,对DBCA(Database Configuration Assistant, DBCA)都不会陌生,有了这个工具,使得创建数据库成为可能.而DBCA本身有图形和静默两种 ...
- java获取程序执行时间
第一种是以毫秒为单位计算的. //伪代码 long startTime=System.currentTimeMillis(); //获取开始时间 doSomeThing(); //测试的代码段 lon ...
- OpenGL---------光照的基本知识
从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛.人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏.因此对于人类而言,光线很大程度上表现了物体的立体感. ...
- 创建zend framework 项目要注意的
1.必须要设置变量环境 我的电脑右击-属性-高级-环境变量 则在环境变量中添加 变量名:PATH 环境值:D:\phpserver\php5.4;D:\ZendFramework\bin 把php.e ...
- [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888
[Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888 标签: androidbitmapjni 2014-05-09 20:35 2985人阅读 评论(1) 收 ...
- Android根据Button状态(normal,focused,pressed)显示不同背景图片
Android根据Button状态(normal,focused,pressed)显示不同背景图片 Android中Button 有focused, selected, pressed 等不同状态,通 ...
- HDU ACM 1495 非常可乐(广搜BFS)
非常可乐 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...