忙了三天,总算浏览完此书。藉此记下 Ice 的 IceBox 服务框架。

在此用 IceBox 框架写 Hello World 程序,即以载体来体现其特性。

第一步:编写 Slice 文件,映射生成 hello.h && hello.cpp。

// hello.ice
module Demo
{
interface print {
void stringPrint(string s);
};
};

第二步:服务器端,将服务的组件放入动态库。

{打印}

// helloI.h
#include <Ice/Ice.h>
#include <hello.h> using namespace std;
using namespace Demo; class helloI : public print {
public:
virtual void stringPrint(const string& s, const Ice::Current&);
};
// helloI.cpp
#include <helloI.h> using namespace std;
using namespace Demo; void helloI::stringPrint(const string& s, const Ice::Current&)
{
cout << s << endl;
}

{服务接口}

// HelloService.h
#include <IceBox/IceBox.h> class HelloServiceI : public IceBox::Service {
public:
virtual void start(const std::string&,
const Ice::CommunicatorPtr&,
const Ice::StringSeq&);
virtual void stop(); private:
Ice::ObjectAdapterPtr _adapter;
};
// HelloServiceI.cpp
#include <Ice/Ice.h>
#include <HelloServiceI.h>
#include <helloI.h> using namespace std;
using namespace Demo; extern "C" { // 服务进入点
IceBox::Service*
create(Ice::CommunicatorPtr communicator)
{
return new HelloServiceI;
}
} void HelloServiceI::start( const string& name, const Ice::CommunicatorPtr& communicator, const Ice::StringSeq& args)
{
_adapter = communicator->createObjectAdapter(name);
Ice::ObjectPtr object = new helloI();
_adapter->add(object, communicator->stringToIdentity("hello"));
_adapter->activate();
} void HelloServiceI::stop()
{
_adapter->deactivate();
}

接下来制作动态库(.so)。此时,已有程序如下:

编译生成动态库。(hello.cpp , helloI.cpp , HelloServiceI.cpp 三个文件)

$    g++ -shared -o libHelloService.so HelloServiceI.cpp helloI.cpp hello.cpp -I. -I  $ICE_HOME/include -fPIC 

第三步:在客户端, 编写客户端代码。

// Client.cpp
#include <Ice/Ice.h>
#include <hello.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("hello:default -p 9990");
printPrx printer = printPrx::checkedCast(base); if (!printer)
throw "Invalid proxy";
printer->stringPrint("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;
}

编译并链接生成可执行程序 client。

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

第四步:配置服务端点和客户。

A. 服务器配置。

// config.icebox
IceBox.Service.Hello=HelloService:create --Ice.Config=config.service

B. 服务端点配置。

// config.service
Hello.Endpoints=tcp -p 9990:udp -p 9990
/*
C. 客户配置。 // config.client
Hello.Proxy=Hello:tcp -p 9990:udp -p 9990
*/

第五步:程序示例。

A. 启动 IceBox 服务器.

$ icebox --Ice.Config=config.icebox

B. Run the client.(连接服务器并请求打印服务)

$ ./client

C.  服务器端进行打印。

Ice分布式程序设计—IceBox(Hello World Application)的更多相关文章

  1. ICE异步程序设计-----AMI/AMD

    1 简介 AMI 异步方法调用(AMI) 这个术语描述的是客户端的异步编程模型支持. 如果你使用AMI 发出远地调用,在Ice run time 等待答复的同时,发出调用的线程不会阻塞.相反,发出调用 ...

  2. Ice的HelloWorld(Java)

    Ice是一种面向对象的中间间平台,入门ice,简单的HelloWorld是必不可少的. 转载请注明http://www.cnblogs.com/zrtqsk/p/3745286.html,谢谢. 一. ...

  3. Ice系列--傻瓜式服务开发IceBox

    前言 相信大家在没有接触过框架之前,都自己或多或少的开发过一些应用服务.每个应用服务除了业务配置还有很多环境配置,资源配置等,这些跟部署相关的配置.服务跟配置文件是一种静态绑定的方式,更新配置还需要重 ...

  4. P2P通信标准协议(三)之ICE

    在P2P通信标准协议(二)中,介绍了TURN的基本交互流程,在上篇结束部分也有说到,TURN作为STUN 协议的一个拓展,保持了STUN的工具性质,而不作为完整的NAT传输解决方案,只提供穿透NAT的 ...

  5. 从一般分布式设计看HDFS设计思想与架构

     要想深入学习HDFS就要先了解其设计思想和架构,这样才能继续深入使用HDFS或者深入研究源代码.懂得了"所以然"才能在实际使用中灵活运用.快速解决遇到的问题.下面这篇博文我们就先 ...

  6. ICE第二篇--一个"hello world"的简单例子

    1 本文介绍一个hello world输出的例子. ice应用的步骤如下: 1. 编写 Slice 定义并编译它. 2. 编写服务器并编译它. 3. 编写客户并编译它. 基本框架图示: 本文代码图示: ...

  7. ice grid配置使用第二篇------实际使用

    一    首先,启动ice grid 1 修改配置文件 node.cfg,appication.xml 修改registry.cfg 配置注册表信息: IceGrid.Registry.Client. ...

  8. 《程序设计语言——实践之路》【PDF】下载

    程序设计语言--实践之路>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...

  9. zeroc ice log4net 多进程log文件问题

    使用zeroc ice 中的icebox 的时候多服务会有多个服务实例,每个实例都要写日志文件,所以要配置多个日志文件区分开来, 类似这样  orderservice_1_20160101.log   ...

随机推荐

  1. Mark Down绘图语法

    以下语法在网易云笔记中测试通过. 绘图的标志位是三个单引号```  开始  ``` 结尾 ,注意是英文半角的单引号,以下的字符也是英文半角状态下的才正确. 搜狗输入法的要特别注意,记得把shift 切 ...

  2. 前后台数据交互 后台封装数据 json格式

    namespace ~.sverIterface { public class EventPlayerInfo { public string name { get; set; } public st ...

  3. HTML 列表详解

    1.有序列表    有序列表是编号列表,用于对网页中的某些内容进行编号排列,以便使读者清晰地了解每行的顺序.在HTML中插入有序列表是通过<ol>和<li>标签来实现的.首标签 ...

  4. Surprise团队第二周项目总结

    Surprise团队第二周项目总结 项目进展 已实现五子棋人人模式部分 人人模式: 基本方式:采取黑棋先行,黑白交替的下棋顺序. 模式:通过鼠标点击相应棋盘中的"交叉点",在lay ...

  5. 记录并分享一下安卓通讯录导入到IPhone

    仅仅记录一下我自己的步骤: 前提:我开始用的是诺基亚1202,黑白屏的功能机: 1.将卡放到安卓手机里面,用应用宝导出全部联系人为VCF后缀文件: 2.下载ITools,用它连接IPhone,导入到I ...

  6. Opera浏览器导出收藏到Chrome,和几个Chrome的一些小技巧

    Opera浏览器还是不错的,但是用着不是特别爽,老是感觉怪怪的,也说不上来哪里不好. 还是换回了Chrome浏览器,Chrome浏览器有一个让我念念不忘的地方,就是收藏夹会自动显示,当打开网页之后,又 ...

  7. PetaPoco 批量插入数据

    网上找的代码,还没经过验证 /// <summary> /// Bulk inserts multiple rows to SQL /// </summary> /// < ...

  8. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

  9. Linux监控实战-2

    vmstat命令 用法:vmstat 1 --->每个1s打印信息; vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存 ...

  10. 转 MySQL 数据备份与还原

    MySQL 数据备份与还原 原贴:http://www.cnblogs.com/kissdodog/p/4174421.html   一.数据备份 1.使用mysqldump命令备份 mysqldum ...