您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 绩效管理 > ICE 基础入门个人整理资料
ICE基础入门个人整理资料ICE自定义了一种Slice语言,目的是定义接口,作用主要应该是保持对象调用或者数据传输时的语言无关性。开发一个ICE应用程序可以分为三步:1.写一个Slice定义,并且编译它2.写服务端,并编译它3.写客户端,并编译它1.写一个Slice定义,并且编译它:文件Printer.ice.moduleDemo{interfacePrinter{voidprintString(strings);};};这个文件很简单,但需要注意,在区分大小写的系统上,扩展名一定是小写.编译也很简单,首先确认你已将你的bin目录加到系统的环境变量Path中.然后把上面这个片断保存成Printer.ice,最后执行slice2cppPrinter.ice,执行后的结果应该是自动生成了printer.h和printer.cpp.2.写服务端,并编译它文件server.cpp.#includeIce/Ice.h#include../print.husingnamespacestd;usingnamespaceDemo;classPrinterI:publicPrinter{public:virtualvoidprintString(conststring&s,constIce::Current&);};voidPrinterI::printString(conststring&s,constIce::Current&){coutsendl;}intmain(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){cerreendl;status=1;}catch(constchar*msg){cerrmsgendl;status=1;}if(ic){try{ic-destroy();}catch(constIce::Exception&e){cerreendl;status=1;}}returnstatus;}以VS2003的配置为例1.把ice的include加入VC7.1的引用文件目录,把ice的lib目录加入VC7.1的库文件目录。然后再把安装目录下的bin文件夹添加到系统的环境变量Path中,最后,把bin文件夹下的所有DLL文件都Copy到Windows安装目录下的System32文件夹下(win98下是System文件夹?)(当然,DLL文件的问题也可以通过修改环境变量来解决,不过是那个变量呢?Whocantellme?)2.新建一个C++的Win32的命令台控制程序,并且设置为空项目,把server.cpp,printer.cpp和printer.h加入这个项目(printer.cpp和printer.h放在项目的目录的外一层目录)3.项目-》属性-》C/C++-》代码生成-》运行时库-》/MD(realse版)或/MDd(debug版)项目-》配置属性-》C/C++-》语言-》启用运行时类型信息/GR开启设置:项目-》属性-》链接器-》输入-》加入iced.libiceutild.lib,此处一定要把realse库和debug库分清,debug库后有个d4.修改printer.cpp中的#includeprinter.h为#includeprinter.h5.OK,编译3.写客户端,并编译它文件client.cpp.#includeIce/Ice.h#include../print.husingnamespacestd;usingnamespaceDemo;intmain(intargc,char*argv[]){intstatus=0;Ice::CommunicatorPtric;try{ic=Ice::initialize(argc,argv);Ice::ObjectPrxbase=ic-stringToProxy(SimplePrinter:default-p10000);PrinterPrxprinter=PrinterPrx::checkedCast(base);if(!printer)throwInvalidproxy;printer-printString(HelloWorld!);}catch(constIce::Exception&ex){cerrexendl;status=1;}catch(constchar*msg){cerrmsgendl;status=1;}if(ic)ic-destroy();returnstatus;}添加一个新项目到当前解决方案,按照上面的方法,对client再一次进行设置。在解决方案管理器的解决方案上点击右键,选择批生成Debug版本,然到用资源管理器到两个解决方案的目录下的Debug文件夹中执行生产的可执行文件。先运行server.exe,然后运行client.exe,哈哈,是不是在server.exe的窗口里出现了HelloWorld!(运行一次client.exe,出现一条)初读代码这一节大部分内容整理自ICE中文手册,在这里我特别感谢马维达同志的翻译给我们的学习带来了方便。读服务端代码文件server.cpp.#includeIce/Ice.h#include../print.husingnamespacestd;usingnamespaceDemo;//惯例,用后缀I表示这个类实现一个接口classPrinterI:publicPrinter{public:virtualvoidprintString(conststring&s,constIce::Current&);};/*打开print.h,看看PrinterI父类的定义namespaceDemo{classPrinter:virtualpublicIce::Object{public://纯虚函数,不能实例化virtualvoidprintString(conststd::string&,//第二个参数有缺省值,实现中可以不使用constIce::Current&=Ice::Current())=0;};};*/voidPrinterI::printString(conststring&s,constIce::Current&){coutsendl;}intmain(intargc,char*argv[]){//程序的退出时的状态,就是否成功执行intstatus=0;//来包含Iceruntime的主句柄(mainhandle)Ice::CommunicatorPtric;try{//初始化Iceruntime(argc和argv是runtime命令参数;//就这个例子而言,服务器不需要任何命令行参数)。//initialize返回一个指向Ice::Communicator对象的智能指针,//这个指针是Iceruntime的主句柄。ic=Ice::initialize(argc,argv);//调用Communicator实例上的createObjectAdapterWithEndpoints,//创建一个对象适配器(比如:网卡就是一种适配器)。//参数是SimplePrinterAdapter(适配器的名字)//和default-p10000(用缺省协议(TCP/IP),侦听端口10000的请求。)//显然,在应用中硬编码对象标识和端口号,是一种糟糕的做法,//但它目前很有效;我们将在以后看到在架构上更加合理的做法。Ice::ObjectAdapterPtradapter=ic-createObjectAdapterWithEndpoints(SimplePrinterAdapter,default-p10000);//服务器端runtime已经初始化,实例化一个PrinterI对象,//为我们的Printer接口创建一个servant(serv服务+-ant人,背一下单词)。Ice::ObjectPtrobject=newPrinterI;//我们调用适配器的add,告诉它有了一个新的servant;//传给add的参数是刚才实例化的servant,再加上一个标识符。//在这里,SimplePrinter串是servant的名字//(如果我们有多个打印机,每个打印机都可以有不同的名字,//更正确的说法是,都有不同的对象标识)。adapter-add(object,Ice::stringToIdentity(SimplePrinter));//调用适配器的activate方法激活适配器//(适配器一开始是在暂停(holding)状态创建的;//这种做法在下面这样的情况下很有用://我们有多个servant,它们共享同一个适配器,//而在所有servant实例化之前我们不想处理请求)。//一旦适配器被激活,服务器就会开始处理来自客户的请求。adapter-activate();//最后,我们调用waitForShutdown。//这个方法挂起发出调用的线程直到服务器实现终止//——或者是通过发出一个调用关闭runtime,ic-waitForShutdown();}catch(constIce::Exception&e){cerreendl;status=1;}catch(constchar*msg){cerrmsgendl;status=1;}if(ic){try{//必须调用Communicator::destroy结束Iceruntime。//destroy会等待任何还在运行的操作调用完成。//此外,destroy还会确保任何还未完成的线程都得以汇合(joined),//并收回一些操作系统资源,比如文件描述符和内存。//决不要让你的main函数不调用destroy就终止,//否则,后果无法想象。ic-destroy();}catch(constIce::Exception&e){cerreendl;status=1;}}returnstatus;}注意,尽管以上的代码不算少,但它们对所有的服务器都是一样的。你可以把这些代码放在一个辅助类里,然后就无需再为它费心了(Ice提供了这样的辅助类,叫作Ice::Application,参见10.3.1节)。就实际的应用代码而言,服务器只有几行代码:六行代码定义PrinterI类,再加上三2行代码实例化一个PrinterI对象,并向对象适配器注册它。读客户端代码文件client.cpp.#includeIce/Ice.h#include../print.husingnamespacestd;usingnamespaceDemo;intmain(intargc,char*argv[]){intstatus=0;Ice::CommunicatorPtric;try{ic=Ice::initialize(argc,argv);//stringToProxy返回的代理(Proxy)类型是Ice::ObjectPrx,//这种类型位于接口和类的继承树的根部(接口的基类)。Ice::ObjectPrxbase=ic-stringToProxy(SimplePrinter:default
本文标题:ICE 基础入门个人整理资料
链接地址:https://www.777doc.com/doc-4040333 .html