为了便于我们学习,我们用一个例子来说明ICE的开发流程及大致框架。
本例子程序的目的是创建一个非常简单的客户-服务器应用。这个应用提供远地打印功能:客户发送要打印文本给服务器,再由服务器把文本发给打印机。
1,编写 Slice 定义
编写任何 Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所用的各个接口。我们为我们的小打印应用编写了这样的 Slice定义:
interfacePrinter
{
voidprintString(strings);
};
我们把这段文本保存在叫作 Printer.ice 的文件中。
2,编写使用 C++ 的 Ice应用
这里我们使用C++语言来编写ICE应用程序
2.1,编译用于 C++的 Slice 定义
在 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.2 编写和编译服务器
#include<Ice/Ice.h>
#include<Printer.h>
usingnamespacestd;
classPrinterI:publicPrinter{
public:
virtualvoidprintString(conststring&s,
constIce::Current&);
};
void
PrinterI::
printString(conststring&s,constIce::Current&)
{
cout<<s<<endl;
}
int
main(intargc,char*argv[])
{
intstatus=0;
Ice::CommunicatorPtric;
try{
ic=Ice::initialize(argc,argv);
Ice::ObjectAdapterPtradapter
=ic->createObjectAdapterWithEndpoints(
"SimplePrinterAdapter","default-p10000");
Ice::ObjectPtrobject=newPrinterI;
adapter->add(object,
Ice::stringToIdentity("SimplePrinter"));
adapter->activate();
ic->waitForShutdown();
}catch(constIce::Exception&e){
cerr<<e<<endl;
status=1;
}catch(constchar*msg){
cerr<<msg<<endl;
status=1;
}
if(ic)
ic->destroy();
returnstatus;
}
<span style="font-size:10px;font-weight: normal;">//我们还包括了由Slice编译器生成的 Printer.h,其中含有我们的打</span><span style="font-size: 10px; font-weight: normal; ">每个 Slice源文件的一开始都有一条用于包括 Ice.h的指令,在Ice.h中包含了Ice run time的各种定义。 </span><span style="font-size: 10px; font-weight: normal; "&
#include<Ice/Ice.h>
#include<Printer.h>
usingnamespacestd;
classPrinterI:publicPrinter{
public:
virtualvoidprintString(conststring&s,
constIce::Current&);
};
void
PrinterI::
printString(conststring&s,constIce::Current&)
{
cout<<s<<endl;
}
int
main(intargc,char*argv[])
{
intstatus=0;
Ice::CommunicatorPtric;
try{
ic=Ice::initialize(argc,argv);
Ice::ObjectAdapterPtradapter
=ic->createObjectAdapterWithEndpoints(
"SimplePrinterAdapter","default-p10000");
Ice::ObjectPtrobject=newPrinterI;
adapter->add(object,
Ice::stringToIdentity("SimplePrinter"));
adapter->activate();
ic->waitForShutdown();
}catch(constIce::Exception&e){
cerr<<e<<endl;
status=1;
}catch(constchar*msg){
cerr<<msg<<endl;
status=1;
}
if(ic)
ic->destroy();
returnstatus;
}
<span style="font-size:10px;font-weight: normal;">//我们还包括了由Slice编译器生成的 Printer.h,其中含有我们的打</span><span style="font-size: 10px; font-weight: normal; ">每个 Slice源文件的一开始都有一条用于包括 Ice.h的指令,在Ice.h中包含了Ice run time的各种定义。 </span><span style="font-size: 10px; font-weight: normal; "&