配置ICE开发环境
Berkeley DB expat OpenSSL bzip2 mcpp
set THIRDPARTY_HOME = d:\ice3party
nmake -f Makefile.mak STATICLIBS=yes OPTIMIZE=yes
6. 最最后,把bin目录加入path变量,以便让系统能找到ICE的dll文件(其实主要是三个dll文件,ice33.dll、iceutil33.dll和bzip2.dll)
ICE的HelloWorld
- module Demo {
- interface Printer {
- void printString(string s);
- };
- };
slice2cpp Printer.ice
下表是Slice与C++的映射关系
#include | #include |
#ifndef | #ifndef |
#define | #define |
#endif | #endif |
module | namespace |
bool | bool |
byte | Ice::Byte |
short | Ice::Short |
int | Ice::Int |
long | Ice::Long |
float | Ice::Float |
double | Ice::Double |
string | Ice::string |
enum | enum(不支持指定数字) |
struct | struct |
class | class(所有方法都是纯虚函数) |
interface | struct(所有方法都是纯虚函数,没有成员变量) |
sequence<T> | std::vector<T> |
dictionary<Key,Value> | std::map<Key,Value> |
exception Err | class Err:public Ice:UserException |
nonmutating方法限定符 | const方法 |
idempotent方法限定符 | - |
out 参数限定符 | 引用类型 |
* | 对应类型的代理类 |
- namespace Demo {
- struct Printer {
- virtual void printString(string s) = 0;
- };
- };
编写服务器端代码:
- 新建一个控制台项目
- 将$ICE\include添加到头文件目录列表中
- 将$ICE\lib\ice.lib和iceutil.lib(对应的Debug版本是iced.lib和iceutild.lib)链接入项目
- 把生成Printer.cpp加入项目
- #include <ice/ice.h>
- #include "printer.h" //slice2cpp生成的文件
- using namespace std;
- using namespace Demo;
- //实现printString方法
- struct PrinterImp : Printer{
- virtual void printString(const ::std::string& s,
- const ::Ice::Current& = ::Ice::Current())
- {
- cout << s << endl;
- }
- };
- int main(int argc, char* argv[])
- {
- Ice::CommunicatorPtr ic;
- try{
- // 初始化Ice运行库
- ic = Ice::initialize(argc, argv);
- // 建立ObjectAdapter,命名为SimplePrinterAdapter
- // 使用默认协议(一般是tcp)并在10000端口监听。
- Ice::ObjectAdapterPtr adapter
- = ic->createObjectAdapterWithEndpoints(
- "SimplePrinterAdapter", "default -p 10000");
- // 把我们实现的Printer加入ObjectAdapter,并命名为SimplePrinter
- Ice::ObjectPtr object = new PrinterImp;
- adapter->add(object, ic->stringToIdentity("SimplePrinter"));
- adapter->activate();
- // 等待直到Communicator关闭
- ic->waitForShutdown();
- }
- catch(const Ice::Exception &e){
- cerr << e << endl;
- }
- catch(const char* msg){
- cerr << msg << endl;
- }
- // 回收Ice运行库所用的资源
- if(ic) ic->destroy();
- return 0;
- }
客户端代码:
- #include <ice/ice.h>
- #include <printer.h>
- using namespace std;
- using namespace Demo;
- int main(int argc, char* argv[])
- {
- Ice::CommunicatorPtr ic;
- try{
- // 初始化Ice运行库
- ic = Ice::initialize(argc, argv);
- // 在10000端口取得SimplePrinter代理对象
- Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
- // 把对象转换成Printer代理
- PrinterPrx printer = PrinterPrx::checkedCast(base);
- if(!printer) throw "Invalid Proxy!";
- // 能过这个代码调用printString方法
- printer->printString("Hello World!");
- }
- catch(const Ice::Exception &e){
- cerr << e << endl;
- }
- catch(const char* msg){
- cerr << msg << endl;
- }
- // 回收Ice运行库所用的资源
- if(ic) ic->destroy();
- return 0;
- }
使用Ice::Application简化代码的编写
virtual int run(int, char*[]) = 0;
服务器端:
- #include <ice/ice.h>
- #include "printer.h"
- using namespace std;
- using namespace Demo;
- struct PrinterImp : Printer{
- virtual void printString(const ::std::string& s, const ::Ice::Current& = ::Ice::Current())
- {
- cout << s << endl;
- }
- };
- class MyApp : public Ice::Application{
- public:
- virtual int run(int, char*[]){
- Ice::CommunicatorPtr& ic = communicator();
- Ice::ObjectAdapterPtr adapter
- = ic->createObjectAdapterWithEndpoints(
- "SimplePrinterAdapter", "default -p 10000");
- Ice::ObjectPtr object = new PrinterImp;
- adapter->add(object, ic->stringToIdentity("SimplePrinter"));
- adapter->activate();
- ic->waitForShutdown();
- return 0;
- }
- };
- int main(int argc, char* argv[])
- {
- MyApp app;
- return app.main(argc, argv);
- }
客户端:
- #include <ice/ice.h>
- #include <printer.h>
- using namespace std;
- using namespace Demo;
- class MyApp: public Ice::Application{
- public:
- virtual int run(int, char*[])
- {
- Ice::CommunicatorPtr ic = communicator();
- Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
- PrinterPrx printer = PrinterPrx::checkedCast(base);
- if(!printer) throw "Invalid Proxy!";
- printer->printString("Hello World!");
- }
- };
- int main(int argc, char* argv[])
- {
- MyApp app;
- return app.main(argc,argv);
- }
相关推荐
从编程语言映射的角度看,文档深入讲解了Slice到C++和Java的映射机制。在C++映射章节中,文档涵盖了标识符映射、模块映射、简单内建类型映射、用户定义类型映射、接口映射、操作映射以及异常处理等。这些内容对开发...
4. **自动类型映射**:ICE支持基本数据类型和自定义类型的自动序列化和反序列化,简化了数据交换的过程。 5. **透明的负载均衡和故障恢复**:ICE内置了负载均衡和故障恢复机制,可以动态调整服务实例,确保系统的高...
`slice2java`是ICE提供的一个工具,它可以将`slice`文件转换为Java语言的接口和数据类型实现。 在这个名为"Zeroc ICE中间件slice2java的ant脚本(v1u0_0)"的资源中,包含了一个Ant构建脚本`slice2java.xml`。Ant是...
在Slice语言章节之后,手册详细阐述了Slice到C++和Java的映射,这有助于开发者理解如何将Slice定义转换为实际的代码。对于C++,讲解了标识符、模块、类型、常量、异常、接口和操作的映射规则,以及异常处理和类的...
Ice支持多种编程语言,包括Java,C++,Python等,使得应用程序能够轻松地进行网络通信和数据交换。在分布式系统中,中间件起到桥梁的作用,简化了不同组件之间的通信。 “slice2java”是Ice工具集的一部分,用于将 ...
- 书籍讨论了如何将Slice定义映射到C++和Java客户端代码。 - 涉及了标识符映射、模块映射、类型映射以及如何处理异常等。 - 提供了slice2cpp和slice2java命令行选项的说明。 8. 具体应用示例: - 书中通过实现一...
- **1.3.2 Slice映射机制**:定义了如何将Slice中的定义映射到具体的编程语言中,如C++或Java。 **1.4 Ice协议** - **1.4.1 Ice协议的组成**:包括消息格式、序列化规则等,确保客户端和服务器之间的通信能够高效...
书籍涵盖了ICE的核心概念、Slice语言的使用、以及如何将Slice定义转换为C++和Java代码。 书中第一部分着重于ICE的综述,包括ICE的基本架构、服务以及它与传统分布式对象计算模型CORBA的对比。作者提供了编写Hello...
- **Slice 到 C++ 和 Java 的映射**:ICE 提供了从 Slice 语言到具体编程语言(如 C++ 和 Java)的转换工具,帮助开发者更容易地进行分布式系统的开发工作。 - **C++ 映射**:书中详细介绍了 Slice 语言中的概念...
#### 五、客户端的Slice到语言映射 - **C++映射**: - Slice定义被转换成C++代码,包括头文件和实现文件。 - 映射规则包括标识符、类型、异常等方面的转换。 - **Java映射**: - Slice定义同样被转换成Java代码...
第 6 章 客户端的 Slice-to-C++ 映射 143 6.1 本章综 143 6.2 引言 143 6.3 标识符的映射 144 6.4 模块的映射 144 6.5 Ice 名字空间 145 6.6 简单内建类型的映射 146 6.7 用户定义类型的映射 146 6.8 常量的映射 150...
- **Ice**支持将Slice定义转换为C++或Java代码,从而简化了客户端和服务端的开发过程。映射规则主要包括: - 类型映射:将Slice中的类型映射为相应的C++或Java类型。 - 接口映射:将Slice接口映射为C++类或Java...
第6章和第8章分别详细介绍了客户端的Slice-to-C++映射和Slice-to-Java映射。这些章节讨论了从Slice到不同编程语言的映射规则,包括标识符的映射、模块的映射、用户定义类型的映射、异常的映射等。这些内容是让ICE...
_slice-to-C++和Slice-to-Java映射_ 这两个章节着重讨论了如何将Slice语言定义转换成C++和Java代码,以便开发者可以利用各自熟悉的编程语言进行开发。 - 开发C++文件系统客户端:文档提到了如何使用C++语言开发...