如何在linux 下开发ice服务linux应用程序开发

从年初的一期《程序员》杂志上了解到ICE以后,因为其对比于 CORBA具有简单、高效、易用的特点,所以一直都有留意。之前也有一段时间下载了Ice 1.x版本和相应的文档来研究,但因工作忙,中断了一段时间。
Ice的主页:&
这几天工作稍微轻松点,有点时间,就继续研究Ice 2.1.1版本。在学习的过程中,免不了要安装的。这篇文章就是想说说安装的问题。
其实Ice-2.1.1安装算是蛮简单的。因为像比较新的Linux操作系统上,Ice所需的辅助软件包都已经有了,如果你装的系统确实没有这些软件,可以在Ice的下载页面上下载到第三方的软件包,然后安装,安装这些都不难,主要是要看软件相应的readme和install类型的文档。
我在Fedora 3上安装,上面带了expat, openssl, db4.2, bzip2,所以基本不用装第三方的软件。唯一一个问题是:Fedora 3上的db4.2没有安装db的C++开发库,所以需要重新编译安装db。
===========&&STEP 1:安装db&&=============================
安装db的文档在db包的docs里面有html格式的说明文档,很简单。解开db的tar/zip包后:
$cd db-ver
$cd build_unix&
$../dist/configure --prefix=/usr --enable-cxx
#make install
==========&&STEP 2:安装Ice 2.1.1包&&====================
解开Ice-2.1.1.tar.gz包后
$cd Ice-2.1.1
$vi config/Make.rules&& #修改prefix为/usr
#make install
这样Ice就安装好了。
==========&&STEP 3:安装IcePy ============================
因为自己想结合之前学习python,刚好ice也支持python语言,所以决定安装IcePy包,如果你只用C++开发的话,IcePy可以不装。解开IcePy.xx.tar.gz后
$cd IcePy-2.1.1
$vi config/Make.rules
增加一行在文件的最前面:
ICE_HOME=/usr
修改prefix=/usr
然后用root权限
#ln -s /usr/lib/python2.4 /usr/python&&#不同版本的python,/usr/lib/pythonx.x目录有点不同
#make install
#ln -s /usr/lib/IcePy.so /usr/lib/python2.4/IcePy.so
至于用两个ln建立两个连接主要是省去运行Ice python程序的时候,设置环境变量的麻烦。因为Ice Python的文件都安装到了python的缺省目录下了,这样会方便很多。
附一个C++编译的问题:
由于我按照书上的例子来学习Ice,所以文件服务器的服务器端那章里面的NodeI类定义如下:
&&&&&&&&class NodeI: virtual public Node {
&&&&&&&&public:
&&&&&&&&&&&&&&&&virtual std::string name(const Ice::Current &)
&&&&&&&&&&&&&&&&NodeI(const std::string &, const DirectoryIPtr &parent);
&&&&&&&&&&&&&&&&static Ice::ObjectAdapterPtr _
&&&&&&&&private:
&&&&&&&&&&&&&&&&const std::string _
&&&&&&&&&&&&&&&&DirectoryIPtr _
&&&&&&&&&&&&&&&&NodeI(const NodeI &);
&&&&&&&&&&&&&&&&void operator=(const NodeI &);
&&&&&&&&};
里面有static的类成员_adapter,由于久未用C++,不记得要在.cpp实现文件里加:
Ice::ObjectAdapterPtr Filesystem::NodeI::_
定义,所以g++连接老报没有定义_adapter的错误,郁闷了一段时间才记起来。而书上的例子并没有提到定义这个东西,如果你是C++新手或像我这样久未用C++的人,一时还找不着北呢。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
积分:60545
积分:60545
排名:第43名
原创:673篇
转载:2174篇
评论:542条
(1)(15)(15)(7)(22)(15)(22)(13)(10)(15)(10)(10)(10)(8)(30)(19)(19)(16)(1)(9)(7)(19)(13)(9)(4)(5)(28)(12)(34)(5)(3)(13)(27)(18)(11)(3)(23)(24)(31)(42)(12)(34)(19)(37)(41)(39)(56)(146)(66)(78)(78)(6)(15)(28)(26)(17)(57)(46)(25)(41)(24)(37)(70)(72)(28)(30)(35)(49)(54)(27)(25)(16)(21)(13)(24)(26)(35)(31)(27)(6)(6)(2)(3)(3)(7)(5)(10)(4)(9)(3)(2)(12)(11)(23)(5)(1)(9)(16)(11)(14)(4)(4)(28)(17)(37)(411)(2)(7)(1)(3)(4)(7)(6)(10)(28)(7)(6)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'当前位置: >>
ICE开发技术培训
ICE开发技术培训演讲:陈锦 培训目标了解ICE框架能做什么 ? 熟悉基于ICE开发的相关技术 ? 熟悉ICE GRID设计、开发、部署过程 ? 了解如何在Linux下的搭建开发环境? 章节ICE框架介绍 ? ICE开发技术 ? 在VS2005环境下开发ICE GRID应用 ? ICE GRID部署 ? 介绍在Linux环境下搭建开发环境 ? 讨论? ICE框架介绍ICE是什么 ? 为什么使用ICE ? ICE提供的服务? ICE是什么Internet Communications Engine ? 由CORBA创始人发起 ? 跨平台,轻量,高性能网络计算引擎 ? 面向对象的中间件平台? 为什么使用ICE? ? ? ? ?提供适用于异种环境的面向对象中间件平台。 提供一组完整的特性,支持广泛的领域中的实 际的分布式应用的开发。 避免不必要的复杂性,使平台更易于学习和使 用。 提供一种在网络带宽、内存使用和CPU 开销 方面都很高效的实现。 提供一种具有内建安全性的实现,使它适用于 不安全的公共网络。 ICE提供的服务? ?IceGridC 基于网格计算的定位和激活服务FreezeC 提供了Ice Servants对象的自动持久性。?? ? ? ?IceSSLC 用于Ice核心的动态的SSL传输插件。Glacier2C Ice的防火墙解决方案,它大大简化了安全程序的部署。IceBoxC 提供可配置的服务并进行集中管理IceStormC 一个支持联盟的消息服务IcePatch2C 一个软件修补和分发的服务。 ICE开发技术??编写slice文件编译slice文件 服务接口实现 配置文件 服务端应用编写 客户端编写?? ?? 编写slice文件module Demo { interface Printer { void printString(string s); }; }; 编译slice文件slice2cpp Printer.ice 生成Printer.cpp Printer.h 服务接口实现class PrinterI : public Printer {public: virtual void printString(const string& s, const Ice::Current&);};void PrinterI:: printString(const string& s, const Ice::Current&){ cout && s && } 配置文件加载配置文件: --Ice.Config=config_file配置文件格式:property_name= # Set property to the empty string or zero 服务端应用编写int main(int argc, char* argv[]){ int status = 0; Ice::CommunicatorP try { // Server implementation here... } catch (const Ice::Exception& e) { cerr && e && status = 1; } catch (const char* msg) { cerr && msg && status = 1; } if (ic) { try { ic-&destroy(); } catch (const Ice::Exception& e) { cerr && e && status = 1; } } } 客户端编写Ice::ObjectPrx base = ic-&stringToProxy( &SimplePrinter:default -p 10000&); PrinterPrx printer = PrinterPrx::checkedCast(base); if (!printer) throw &Invalid proxy&; printer-&printString(&Hello World!&); 在VS2005环境下开发ICE GRID? ? ? ??? ? ? ? ? ? ?目录安排 建立解决方案 项目设置 slice定义 在vs中编译slice 编写服务端代码 编写客户端代码 Registry配置 Node配置 启动IceGrid服务端 部署应用 客户端测试 目录安排 建立解决方案新建解决方案Demo ? 新建C++的Win32的空白项目server ? 新建C++的Win32的空白项目client? 项目设置把ice的include加入VC8的引用文件目录,把 ice的lib目录加入VC8的库文件目录。 ? 项目-》属性-》C/C++ -》代码生成-》运 行时库-》/MD(realse版)或/MDd(debug版) ? 项目-》配置属性-》C/C++-》语言-》启用运 行时类型信息/GR 开启 ? 设置:项目-》属性-》链接器-》输入-》 加入iced.lib iceutild.lib,此处一定要把 realse库和debug库分清, debug库后有个d? Slice定义#ifndef HELLO_ICE #define HELLO_ICE module Demo{ interface Hello{ [&cpp:const&] idempotent void sayHello(); idempotent void hutdown(); };}; #endif 在VS中编译slice?Slice自定义生成命令行 ..\..\3rdp\ice\bin\slice2cpp.exe ..\..\slice\Hello.ice ? Slice自定义生成说明 正在编译$(InputFileName)... ? Slice自定义生成输出 Hello.Hello.h ? Slice自定义生成附加依赖项 ..\..\3rdp\ice\bin\slice2cpp...\..\3rdp\ice\lib\sliced. lib *设置完使用自定义生成工具后,就可以编译了 编写服务端代码void HelloI::sayHello(const Ice::Current&) const { cout && _name && & says Hello World!& && } void HelloI::shutdown(const Ice::Current& c) { cout && _name && & shutting down...& && c.adapter-&getCommunicator()-&shutdown(); } 编写客户端代码HelloP try { hello = HelloPrx::checkedCast(communicator()-&stringToProxy(&hello&)); } catch(const Ice::NotRegisteredException&) { IceGrid::QueryPrx query = IceGrid::QueryPrx::checkedCast(communicator()&stringToProxy(&DemoIceGrid/Query&)); hello = HelloPrx::checkedCast(query-&findObjectByType(&::Demo::Hello&)); } if(!hello) { cerr && argv[0] && &: couldn't find a `::Demo::Hello' object.& && return EXIT_FAILURE; } Registry配置在conf目录下建立config.grid文件 IceGrid.Registry.Client.Endpoints=default -p 12000 IceGrid.Registry.Server.Endpoints=default IceGrid.Registry.Internal.Endpoints=default IceGrid.Registry.Data=db/registry IceGrid.Registry.PermissionsVerifier=Demo IceGrid/NullPermissionsVerifier IceGrid.Registry.AdminPermissionsVerifier=Demo IceGrid/NullPermissionsVerifier IceGrid.Registry.SSLPermissionsVerifier=Demo IceGrid/NullSSLPermissionsVerifier IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSS LPermissionsVerifier Node配置在conf目录下建立config.node1 Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 127.0.0.1 -p 12000 IceGrid.Node.Name=node1 IceGrid.Node.Endpoints=tcp IceGrid.Node.Data=E:\demo\db\node1 IceGrid.Node.Output=E:\demo\db\node1 IceGrid.Node.Trace.Replica=2 IceGrid.Node.Trace.Activator=1 第二个节点node2类似 启动IceGrid服务端启动registry icegridregistry -Ice.Config=%CURRENT_DIR%\conf\config.grid 启动节点1 icegridnode -Ice.Config=%CURRENT_DIR%\conf\config.node1 启动节点2 icegridnode -Ice.Config=%CURRENT_DIR%\conf\config.node2 部署应用Icegridadmin C Ice.Config=./conf/config.grid ? # application add “./conf/application.xml”?application.xml为部署描述文件 客户端测试set ICE_CONFIG=%CURRENT_DIR%/con f/config.client ? .\bin\client.exe?输入命令就可以看到效果了 Linux下搭建Ice开发环境1、mkdir ThirdParty 2、cp ThirdParty-Sources-3.0.1.tar.gz ThirdParty 3、tar Cxzvf ThirdParty-Sources-3.0.1.tar.gz 4、tar Cxzvf openssl-0.9.8a.tar.gz 5、cd openssl-0.9.8a 6、./ Cmake install 7、cd .. 8、tar Cxzvf expat-1.95.8.tar.gz 9、cd expat-1.95.8 10、./make install Linux下搭建Ice开发环境(续)11、cd .. 12、tar Cxzvf db-4.3.29.NC.tar.gz 13、cd db-4.3.29.NC 14、cd build_unix 15、../dist/make install 16、cd ../.. 17、tar Cxzvf Ice-3.0.1.tar.gz 18、cd Ice-3.0.1 19、将config文件夹下的Make.rules.Linux,将c++改为g++ 20、将config文件夹下的Make.rules里面的变量修改为第三方库的 路径,找?号的是系统已经安装的,在linux下STL就是STLport 不用另行安装。 Linux下搭建Ice开发环境(续)#STLPORT_HOME ?= /opt/STLport # # If libbzip2 is not installed in a standard location where the compiler # can find it, set BZIP2_HOME to the bzip2 installation directory. # #BZIP2_HOME ?= /opt/bzip2 # # If Berkeley DB is not installed in a standard location where the # compiler can find it, set DB_HOME to the Berkeley DB installation # directory. # #DB_HOME = /root2/opt/db # # If OpenSSL is not installed in a standard location where the # compiler can find it, set OPENSSL_HOME to the OpenSSL installation # directory. # OPENSSL_HOME = /root2/opt/openssl # # Define if your OpenSSL requires Kerberos, and if Kerberos is not # installed in a standard location. # KERBEROS_HOME ?= /usr/kerberos Linux下搭建Ice开发环境(续)# # If expat is not installed in a standard location where the # compiler can find it, set EXPAT_HOME to the expat # installation directory. # EXPAT_HOME = /root2/opt/expat # # If readline is not installed in a standard location where the # compiler can find it, AND you want to use readline, # set READLINE_HOME to the readline installation directory. # # #READLINE_HOME ?= /opt/readline 21、make install 谢谢!
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。用户名:lch7510
访问量:2798
无忧币:20
注册日期:
赖长辉呀 T287的
周老师!我来光临啊
一周热赞排行
51CTO推荐博文
13.1.1.SELinux配置文件(/etc/selinux/config
13.1.1.SELinux配置文件(/etc/selinux/config)
SELinux配置文件/etc/selinux/config控制系统下一次启动过程中载入哪个策略,以及系统运行在哪个模式下,我们可以使用sestatus命令确定当前SELinux的状态,清单13-1显示了一个config文件的例子:
清单13-1./etc/selinux/config文件的内容
1 # This file controls the state of SELinux on the system.2 # SELINUX= can take one of these three values:3 # enforcin..
Linux系统Qmail邮件服务器安装过程解析
Qmail邮件服务器安装过程-
checkpassword-0.90(pop3验证用户程序)
cmd5checkpw-0.22.tar.gz
ucspi-tcp-0.88(tcpserver等服务程序)
qmail-smtpd-auth-0.30.tar.gz(smtp补丁程序)
qmail-1.03.tar.gz(Qmail基本系统包)
vpopmail-5.2.1.tar.gz(虚拟域用户pop3支持)
ezmlm-0.53.tar.gz(邮件列表管理软件)
autorespond.tar.gz(自动回复程序)
qmailadmin-1.0.6.tar.gz(虚拟域web方式管理)
Linux下ps查找进程用kill终止命令
首先,我们需要使用linux下另外一个ps命令查找与进程相关的PID号:ps aux | grep program_filter_word
ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
ps -e 此参数的效果和指定"A"参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所..
来自望兄的总结。这些文档都是最基础的了。如果你有类似的不清楚的问题,这里都是比较权威的回答了。1.什么是邮件中继? 邮件中继是指将邮件转发到你所在域以外的域的能力。更具体地说,当使用与您的 SMTP 服务器的入站连接来向外部域发送电子邮件时,便发生了中继。 2.在Exchange 2003中,如何知道哪些SMTP域是你的权威域?打开Exchange Server Manager-收件人策略,右键选中您要查看的收件人策略,选择属性,点击电子邮件地址..拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3ad053ec215e43cb-ua98).
重新安装浏览器,或使用别的浏览器49896人阅读
知识纵横(68)
1、ICE是什么?
&ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够以最小的代价构建分布式应用程序。ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等。
2、为什么会有ICE?&
&ICE是分布式应用的一种比较好的解决方案,虽然现在也有一些比较流行的分布式应用解决方案,如微软的.NET(以及原来的DCOM)、CORBA及WEB SERVICE等,但是这些面向对象的中间件都存在一些不足:
&.NET是微软产品,只面向WINDOWS系统,而实际的情况是在当前的网络环境下,不同的计算机会运行不同的系统,如LINUX上面就不可能使用.NET;
&CORBA虽然在统一标准方面做了很多的工作,但是不同的供应商实现之间还是缺乏互操作性,并且目前还没有一家供应商可以针对所有的异种环境提供所有的实现支持,且CORBA的实现比较复杂,学习及实施的成本都会比较高;
&WEB SERVICE最要命的缺点就是他的性能问题,对于要求比较高的行业是很少会考虑WEB SERVICE的。
&ICE的产生就是源于.NET、CORBA及WEB SERVICE这些中间件的不足,它可以支持不同的系统,如WINDOWS、LINUX等,也可以支持在多种开发语言上使用,如C++、C、JAVA、RUBY、PYTHON、VB等,服务端可以是上面提到的任何一种语言实现的,客户端也可以根据自己的实际情况选择不同的语言实现,如服务端采用C语言实现,而客户端采用JAVA语言实现,底层的通讯逻辑通过ICE的封装实现,我们只需要关注业务逻辑。
3、ICE是如何工作的?
&Ice 是一种面向对象的中间件平台,这意味着 Ice为构建面向对象的客户-服务器应用提供了工具、API 和库支持。要与Ice持有的对象进行通信,客户端必须持有这个对象的代理(与CORBA的引用是相同的意思),这里的代理指的是这个对象的实例,ICE在运行时会定位到这个对象,然后寻找或激活它,再把In参数传给远程对象,再通过Out参数获取返回结果。
&这里提到的代理又分为直接代理和间接代理,直接代理其内部保存有某个对象的标识,以及它的服务器的运行地址;间接代理指的是其内部保存有某个对象的标识,以及对象适配器名(object adapter name),间接代理没有包含寻址信息,为了正确地定位服务器,客户端在运行时会使用代理内部的对象适配器名,将其传给某个定位器服务,比如IcePack服务,然后,定位器会把适配器名当作关键字,在含有服务器地址的表中进行查找,把当前的服务器地址返回给客户,客户端 run time现在知道了怎样联系服务器,就会像平常一样分派
(dispatch)客户请求。
&ICE可以保证在任何的网络环境或者操作系统下,成功的调用只有一次,它在运行时会尽力的定位到远程服务器,在连接失败的情况下会做尝试性重复性连接,确实连不上的情况会给用户以提示。
&客户端在调用服务端的方法时,可以采取同步或异步的方式实现,同步调用就相当于调用自己本地的方法一样,其它行为会被阻塞;异步调用是非常有用的调用方式,如服务端需要准备的数据来自于其它异步接口,这个时候客户端就不需要等待,待服务端数据准备充份后,以消息的方式通知客户端,服务端就可以去干其它的事情了,而客户端也可以到服务端获取数据了。
4、ICE调用模式
&ICE采用的网络协议有TCP、UDP以及SSL三 种,不同于WebService,ICE在调用模式上有好几种选择方案,并且每种方案正对不同的网络协议的特性做了相应的选择。
&Oneway(单向调用):客户端只需将调用注册到本地传输缓冲区(Local Transport Buffers)后就立即返回,不会等待调用结果的返回,不对调用结果负责。
&Twoway(双向调用):最通用的模式,同步方法调用模式,只能用TCP或SSL协议。
&Datagram(数据报):类似于Oneway调用,不同的是 Datagram调用只能采用UDP协议而且只能调用无返回值和无输出参数的方法。
&BatchOneway(批量单向调用):先将调用存 在调用缓冲区里面,到达一定限额后自动批量发送所有请求(也可手动刷除缓冲区)。
&BatchDatagram(批量数据报):与上类似。
&不同的调用模式其实对应着不动的业务,对于大部分的有返回值的或需要实时响应的方法,我们可能都采用Twoway方式调用,对于一些无需返回值或 者不依赖返回值的业务,我们可以用Oneway或者BatchOneway方式,例如消息通知;剩下的Datagram和BatchDatagram方式 一般用在无返回值且不做可靠性检查的业务上,例如日志。
&5、客户端与服务端的结构
&这个图示显示了使用ICE做为中间件平台,客户端及服务端的应用都是由应用代码及ICE的库代码混合组成的。
&客户应用及服务器应用分别对应用的是客户端与服务端。
&代理是根据SLICE定义的ice文件实现,它提供了一个向下调用的接口,提供了数据的序列化与反序化。
&ICE的核心部份,提供了客户端与服务端的网络连接等核心通信功能,以及其它的网络通信功能的实现及可能的问题的处理,让我们在编写应用代码的时候不必要去关注这一块,而专注于应用功能的实现。
6、ICE的简单示例
&要使用ICE,必须先安装ICE,安装及配置参考如下:
&WINDOWS:
&LINUX(BDB的安装还有问题,无法使用SLICE2JAVA):
&这个示例是JAVA示例,是从ICE的帮助文档中摘出来的,是一个输出Hello World的测试程序,采用的ICE版本是3.1.1。
&1)、准备一个ice文件并命名为:Printer.ice,其内容为:
module Demo {
interface Printer {
void printString(string s);
&&2)、转到命令行,在Printer.ice文件保存目录执行命令:
& slice2java Printer.ice
&会在目录下面生成一个Demo 文件夹,里面会生成一些JAVA文件,如下图示:
&&3)、这些文件的类图结构如下:
&&这里对生成的一些文件做些解释,分两两部份,服务端类文件及客户端类文件:
&o &interface-name&.java
&这个源文件声明在ICE文件中定的接口名称的Java接口,如这里是Printer。
&o _&interface-name&Operations.java
&_&interface-name&OperationsNC.java
&这是两个定义操作的接口文件,每个接口文件中定义了一个操作实现,定义的操作与Slice接口中定义的操作相一致,只是在_&interface-name&Operations.java中定义的方法多了一个参数“Ice.Current __current”(注:Current对象的定义,请参见3.1.1版本文档中的31.6 The Ice::Current Object说明),这个参数的作用是可以允许我们访问 “正在执行的请求”和 “服务器中的操作的实现”等信息,也就是我们的请求需求需要其它请求的支持时或者要获取其它请求的执行结果时,我们可以调用这个方法,这两个接口文件都会被接口文件_&interface-name&.java继承。
&o& _&interface-name&Disp.java 这个文件包含的是服务器端骨架类的定义,所用接口定义都要继承这个东西,这里的接口指供客户端调用的接口。
&o &interface-name&PrxHolder.java 代理定义holder 类,是对应Out参数使用的。一般参数都是值传递,这个类的作用是使参数通过引用传递。ICE框架应用了很多反射机制,这个类是改变远程参数的一个映射。
& o _&interface-name&Del.java
& o _&interface-name&DelD.java
& o _&interface-name&DelM.java
&不用关心上面的这些文件,这些文件包含的是供Java 映射内部使用的代码;它们包含的功能与应用程序无关。
&o &interface-name&Prx.java 这个是代理接口。例如PrinterPrx,在客户的地址空间中, PrinterPrx 的实例是“远地的服务器中的Printer接口的实例”的“本地大使”。与服务器端对象有关的所有细节,比如其地址、所用协议、对象标识,都封装在该实例中。
&注意, PrinterPrx 继承自Ice.ObjectPrx。这反映了这样一个事实:所有的Ice 接口都隐式地继承自Ice::Object。
&说的更明白些,就是这个类的方法调用都是远程服务端的调用,执行printString()方法的具体实现是在远程服务端执行的。
&o &interface-name&PrxHelper.java 这个是接口的代理定义助手类,就是帮你获得代理类的。经常用的就两个方法checkedCast 和 uncheckedCast 。这两个方法实现的都是向下转换。
&注意, checkedCast 会联系服务器。这是必要的,因为只有服务器情况中的代理实现确切地知道某个对象的类型。所以, checkedCast 可能会抛出ConnectTimeoutException 或ObjectNotExistException(这也解释了为何需要助手类:ICE在运行时必须联系服务器,所以我们不能使用Java 的向下转换)。
&与此相反, uncheckedCast 不会联系服务器,而是会无条件地返回具有所请求的类型的代理 。但是,如果你要使用uncheckedCast,你必须确定这个代理真的支持你想要转换到的类型;而如果你弄错了,你很可能会在调用代理上的操作时,引发运行时异常。对于这样的类型失配,最后可能会引发OperationNotExistException,但也有可能引发其他异常,比如整编异常。而且,如果对象碰巧有一个同名的操作,但参数类型不同,则有可能根本不产生异常,你最后就会把调用发送给类型错误的对象;这个对象可能会做出非常糟糕的事情。
&4)、建立一个ECLIPSE工程,将生成的文件拷贝到src目录下,并在classpath中导入Ice.jar。
&5)&、建立三个测试JAVA文件,Server.java、PrinterI.java及Client.java:
&PrinterI.java是对服务端实现骨架类_PrinterDisp的实现,返回时将PrinterI.java对象返回给客户端,这里实现的功能是直接输出传入的String参数:
public class PrinterI extends Demo._PrinterDisp {
public void printString(String s, Ice.Current current) {
System.out.println(s);
&&Server.java是服务端服务代理,用于接收客户端的请求操作:
public class Server {
public static void main(String[] args) {
int status = 0;
municator ic =
//初使化连接,args可以传一些初使化参数,如连接超时时间,初使化客户连接池的数量等
ic = Ice.Util.initialize(args);
//创建名为SimplePrinterAdapter的适配器,并要求适配器使用缺省的协议(TCP/IP侦听端口为10000的请求)
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(&SimplePrinterAdapter&, &default -p 10000&);
//实例化一个PrinterI对象,为Printer接口创建一个服务对象
Ice.Object object = new PrinterI();
//将服务单元增加到适配器中,并给服务对象指定名称为SimplePrinter,该名称用于唯一确定一个服务单元
adapter.add(object, Ice.Util.stringToIdentity(&SimplePrinter&));
//激活适配器,这样做的好处是可以等到所有资源就位后再触发
adapter.activate();
//让服务在退出之前,一直持续对请求的监听
ic.waitForShutdown();
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
if (ic != null) {
// Clean up
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
System.exit(status);
&Client.java是客户端代码,用于向服务端发起请求,并操作返回的代理对象:
public class Client {
public static void main(String[] args) {
int status = 0;
municator ic =
ic = Ice.Util.initialize(args);
//传入远程服务单元的名称、网络协议、IP及端口,获取Printer的远程代理,这里使用的stringToProxy方式
Ice.ObjectPrx base = ic.stringToProxy(&SimplePrinter:default -p 10000&);
//通过checkedCast向下转换,获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象
Demo.PrinterPrx printer = Demo.PrinterPrxHelper.checkedCast(base);
if (printer == null) throw new Error(&Invalid proxy&);
//把Hello World传给服务端,让服务端打印出来,因为这个方法最终会在服务端上执行
printer.printString(&Hello World!&);
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
if (ic != null) {
// Clean up
ic.destroy();
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
System.exit(status);
6)、运行客户端和服务端
&运行服务端:java Server
&运行客户端:java Client
&看看效果吧。
&7、ICE的性能和效率
&ICE的性能是比较好的,因为他本身的传输机制都是基于二进制,网上有人曾经做过性能测试,评价比较好,我本人还没有做性能测试,目前的判断只是基于网络数据,请先看下面的文章:
&高性能计算-ICE 性能测试
&ICE与CORBA比较的优势
8、ICE的优点
支持同步和异步的消息传递;
支持多个接口;
机器无关性,客户及服务器与底层的机器架构屏蔽开来。对于应用代码而言,像字节序和填充这样的问题都隐藏了起来;
语言无关性,客户和服务器可以分别部署,所用语言也可以不同;
实现无关性,客户不知道服务器是怎样实现其对象的。这意味着,在客户部署之后,服务器的实现可以改变;
操作系统无关性,Ice API 完全是可移植的,所以同样的源码能够在 Windows和 UNIX
上编译和运行;
线程支持,Ice run time 完全是线程化的,其 API 是线程安全的,作为应用开发者,(除了在访问共享数据时进行同步)无需为开发线程化的高性能客户和服务器付出额外努力。
传输机制无关性,Ice 目前采用了TCP/IP 和 UDP作为传输协议。客户和服务器代码都不需要了解底层的传输机制;
位置和服务器透明性,Ice run time 会负责定位对象,并管理底层的传输机制,比如打开和关闭连接;
安全性,通过 SSL强加密,可以使客户和服务器完全安全地进行通信,这样,应用可以使用不安全的网络安全地进行通信,你可以使用 Glacier穿过防火墙,实现安全的请求转发,并且完全支持回调;
内建的持久机制,使用 Freeze,创建持久的对象实现变成了一件很容易的事情,Ice提供了对高性能数据库 Berkeley DB[18] 的内建支持;
开放源码。
这里只是简单的对ICE进行介绍,还有很多东西没有提到,如ICE的语法规则、ICE的版本控制(Facet)、持久化 (Feeze)、服务装箱管理 (ICEBox)、文件分发(ICEPatch2)、发布/订阅 服务(ICEStorm)、网络拓扑负载解决方案--终极武器(ICEGrid)、提供使用安全传输入协议SSL的插件(IceSSL)、轻量级的ICE应用防火墙其解决方案(Galcier2),这些留待大家后面去学习了。
本文出自:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6807598次
积分:60393
积分:60393
排名:第44名
原创:462篇
转载:209篇
译文:28篇
评论:1769条
(3)(7)(7)(10)(3)(5)(2)(3)(10)(3)(1)(10)(8)(1)(1)(11)(13)(18)(9)(5)(2)(13)(14)(31)(1)(1)(2)(3)(4)(13)(3)(1)(12)(6)(4)(6)(4)(2)(1)(6)(15)(35)(11)(3)(2)(25)(2)(3)(13)(2)(5)(2)(1)(15)(5)(7)(8)(41)(33)(54)(40)(7)(2)(4)(1)(12)(17)(3)(8)(8)(1)(55)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 linux 程序开发 的文章

 

随机推荐