【
colorado
】
说明文档位于DPWI第3章,程序位于Ice 3.3.1发布${ICE_HOME}/demo/book/printer。
1、Slice文件
Printer.ice 定义如下:
#ifndef SIMPLE_ICE
#define SIMPLE_ICE
module Demo
{
interface Printer
{
void printString(string s);
};
};
#endif
本Slice文件定义了模块Demo,它含有Printer接口,定义了printString操作,printString 操作接受一个字符串。程序功能是客户端调用printString发送字符串给服务器,服务器将字符串打印出来。
编译本slice文件:
slice2cpp Printer.ice
生成 Printer.h/Printer.cpp 文件,定义了接口的规范,实现了运行时支持的类型以及类型的整编与解编。在我们编写的C/S程序中引用了这些文件,以便使用接口。
2、服务器端
Server.cpp:
//必须包含Ice.h文件,以支持Ice运行时
#include <Ice/Ice.h>
//必须包含Printer.h,以使用Slice规范
#include <Printer.h>
using namespace std;
using namespace Demo;
/*
骨架类Printer根据Printer.ice定义由Slice2cpp编译器生成,
它的printString是纯虚方法,骨架类不能被实例化。
服务者PrinterI类继承自骨架类Printer,提供了printString纯虚方法的实现。
*/
class PrinterI : public Printer {
public:
virtual void printString(const string & s,const Ice::Current &);
};
/*
Ice:Current对象为服务器中操作的实现提供了有关当前执行请求的信息,
如适配器,连接,标识,层面,操作,操作模式,上下文,请求ID等。
*/
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 {
//初始化Ice,获取通讯器,智能指针
ic = Ice::initialize(argc, argv);
//在通讯器ic上创建对象适配器SimplePrinterAdapter,缺省协议(TCP),在端口10000上监听
Ice::ObjectAdapterPtr adapter
= ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
//创建服务者类PrinterI
Ice::ObjectPtr object = new PrinterI;
//将服务者类PrinterI加入对象适配器,服务者类的名称是SimplePrinter,
//客户端必须使用此名称的请求标识来请求服务者的操作。
adapter->add(object,ic->stringToIdentity("SimplePrinter"));
//激活对象适配器,客户端请求现在可以分派给服务者类PrinterI。
adapter->activate();
//挂起当前主函数所在线程,等待通讯器关闭
ic->waitForShutdown();
} catch (const Ice::Exception & e) { //捕捉Ice运行时抛出的异常
cerr << e << endl;
status = 1;
} catch (const char * msg) {//捕捉致命错误,输出错误串
cerr << msg << endl;
status = 1;
}
//通讯器必须初始化过,否则不能调用destroy
if (ic) {
try {
ic->destroy();//销毁通讯器
} catch (const Ice::Exception & e) {
cerr << e << endl;
status = 1;
}
}
return status;
}
3、客户端
#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 {
//初始化Ice,获取通讯器,智能指针
ic = Ice::initialize(argc, argv);
//创建通讯器的代理基类,该代理使用的请求标识为SimplePrinter,端口号:10000,协议:默认(TCP)
Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
//代理基类向下转型为PrinterPrx代理类,调用本操作会向服务器发送请求。
//如果转型成功就返回Printer接口的代理,如果转型失败就返回null代理。
PrinterPrx printer = PrinterPrx::checkedCast(base);
//不是Printer接口的代理,抛出异常
if (!printer)
throw "Invalid proxy";
//是Printer接口的代理,调用代理的操作printString
printer->printString("Hello World!");
} catch (const Ice::Exception & ex) {//捕获Ice运行时异常
cerr << ex << endl;
status = 1;
} catch (const char * msg) {//捕捉致命错误,输出错误串
cerr << msg << endl;
status = 1;
}
//通讯器必须初始化过,否则不能调用destroy
if (ic) {
try {
ic->destroy();//销毁通讯器
} catch (const Ice::Exception & ex) {
cerr << ex << endl;
status = 1;
}
}
return status;
}
4、运行
客户端和服务器使用VC++的工程文件完成编译,然后先运行Server,再运行Client。关闭时,以Ctrl+C结束Server程序。
5、说明
${ICE_HOME}/demo/Ice/minimal是一个与此例非常类似的最小Ice应用程序。不同之处在于minimal的服务器定义了对强制关闭信号的处理,如对Ctrl+C定义了:IceUtil::CtrlCHandler ctrCHandler(onCtrlC);然后实现了static void onCtrlC(int)函数,对接收到Ctrl+C信号进行了处理。另外minimal程序用单独的helloI文件实现了hello接口的sayHello操作规范。
本文所展示的程序比马维达先生中译本(Ice 1.3.0)的程序在异常处理方面有所增强,请读者注意。
分享到:
相关推荐
### HelloWorld_ICE分布式应用开发入门 #### 概述 本文旨在通过一个简单的示例来介绍如何使用ICE(Internet Communications Engine)进行分布式应用开发。ICE是一种强大的中间件框架,用于构建可扩展、健壮且高...
《ICE HelloWorld程序详解》 ICE(Internet Communications Engine)是由ZeroC公司开发的一种分布式对象中间件,它提供了一种高效、灵活、易于使用的跨平台通信框架,适用于构建大规模的分布式应用程序。"ICE Hello...
ICE-3.7.4 最新安装文件msi文件,windows版 ICE常见报错 Exception in thread Ice.ConnectionRefusedException error = 0 at IceInternal.Network.doFinishConnect(Network.java:417) at IceInternal....
标题“fy_iceworld_2002.zip”和描述中的信息看似简洁,但实际上指向了一个特定的游戏资源包,可能与著名的第一人称射击游戏《反恐精英》(Counter-Strike)有关。标签“fy_iceworld”进一步确认了这一点,因为"FY...
iCE40系列:超低功耗FPGA评估和开发方案.pdf
标题中的“ice-cream:hello-project home-app”指的是一个名为“冰淇淋商店”的在线项目,它是一个基本的在线网站,主要用于在数字平台上开设冰淇淋商店。这个项目可能是为了展示商品、处理订单以及提供用户交互功能...
为了解决这一问题,ICE-BA(Incremental, Consistent and Efficient Bundle Adjustment for Visual-Inertial SLAM)提供了一种新颖的数值求解器,旨在提高计算效率,允许使用更多的测量数据来提高定位的准确性和鲁棒...
iCE40 Ultra是Lattice半导体公司生产的一款FPGA芯片,特别适用于移动设备。FPGA(现场可编程门阵列)是一种可以通过编程来配置的半导体设备,可以根据需要进行功能定制。iCE40 Ultra这款产品在移动设备领域的应用,...
在Java中,实现`HelloWorld::Hello`接口,并启动ICE的Java服务器。 通过以上步骤,你已经成功创建了一个简单的ICE分布式应用。这只是ICE功能的冰山一角,更深入的探索包括多线程支持、负载均衡、安全性设置以及更多...
冰刃iceworld通过先进的扫描技术和深度分析,能揭示这些隐藏的威胁,使得用户有机会清除它们,从而提升系统的安全性。 该软件的名称“冰刃”暗示了其锋利且精准的查杀能力,如同寒冰般无孔不入,切开病毒的伪装。...
根据提供的文档信息,我们可以深入探讨"N070ICE-G02"液晶屏的相关知识点,包括其规格、电气特性以及机械特性等。 ### 一、总体描述 #### 1.1 概览 N070ICE-G02是群创光电(InnoLux)生产的一款液晶显示屏。该屏幕...
作者提供了编写HelloWorld应用的步骤,包括如何编写Slice定义以及如何使用C++和Java语言编写ICE应用程序。 在第二部分中,书籍详细介绍了Slice语言。Slice是ICE所使用的接口定义语言,它允许开发者定义分布式对象的...
《Iceworld:安全的进程查看工具》 在IT领域,系统监控和安全是至关重要的环节。今天我们将聚焦于一个名为"Iceworld"的工具,它实际上是一个强大的进程查看工具,专为用户提供系统的深入洞察和安全保障。这个工具的...
数据湖:Iceberg:Iceberg数据湖的流式数据处理.docx
雪地地图改版 草地 f
ICE3PCS02G是英飞凌(INFINEON)推出的一款专用于连续传导模式(CCM)下的独立功率因数校正(PFC)控制器芯片,适用于8引脚PG-DSO封装。这款芯片设计用于提升拓扑结构的转换器,并且需要的外部组件数量极少,具有高...
【描述】"这是用java开发的ice的helloworld" 暗示了这个压缩包的核心内容是一个Java项目,该项目展示了如何使用Ice库来实现一个基础的“Hello, World!”服务。在Java中,"Hello, World!"程序通常涉及创建一个类,该...
冰雪世界 真实冰纹理材质着色
这一章节通过创建一个简单的HelloWorld应用来介绍Ice的基本使用方法。具体包括: - **1.2.1 编写 Slice 定义**:指导用户如何编写Slice文件来定义应用的服务接口。 - **1.2.2 使用 C++ (C++11) 编写 Ice 应用**:...