ICE代码详解
- 格式:docx
- 大小:13.69 KB
- 文档页数:4
ICE简单介绍(InternetCommunicationEngine)1. ICE的⼀些背景ICE 是ZeroC的主要产品, 是⼀个object-oriented toolkit,⽤来帮助我们构建分布式应⽤程序,使我们专注于程序的逻辑⽽不是底程⽹络交互的细节ZeroC provides a fast and highly-scalable communications infrastructure for demanding technical applications, such as telecom, defense, finance, on-line entertainment, manufacturing, and process control. ZeroC's core product is Ice, the . Ice is one of the most versatile and powerful distributed computing platforms ever.With an aggressive, no-nonsense licensing model for the Open Source community (GPL, the ), in addition to traditional for commercial customers, ZeroC aims to establish Ice as the leading technical middleware product.ice提供了强⼤的 RPC(remote procedure call)功能,(同步异步Invocation,dispatch), one-way (对tcp,ssl),datagram(udp) ,也就是客户端调⽤了就不管了(fire and forget) 以及提供了除rpc之外的⼏个强⼤的服务,iceGrid, iceStorm....ICE提供的编程模型:4步,定义slice⽂件, slice⽂件⽣成相应语⾔的代码(根据client,server所使⽤的语⾔),编写client-side代码并链接ICE,编写server-side代码并链接ICEICE⼴泛⽀持了各主流语⾔和 platform(OS & compiler)2. ice manual的基本内容这个⽂档是ice主要的⽂档了,编程什么的都参考它,主要分了4个部份; 2.1,概述,ice主要的⼏个部份介绍,在2.2.2(terminology)作为术语解释,包括ice object, ice proxy, ice object简单说是⼀个可以响应client request的实体,它有⾄少⼀个interface,interface则有⼀个或多个operation,每个ice object都有⼀个object identity(object在35章详讲); ice proxy: client要想contact⼀个ice object,就必须hold⼀个ice proxy,它就是ice object的本地代理,所以proxy必须有object的address信息,以及object的identity来定位object,(proxy在32章详讲), 以及⼀个hello world例⼦,告诉我们最简单的ice client,server怎么写2.2 slice(specification language for ice) , slice在client和server之间做了⼀个约定, slice会被c++的预处理器作预处理,所以我们在⽂件中都应该⽤到#ifndef, #define,#endif,另外 #include应该⽤<>,这样slice compiler会在编译选项的-I路径中去查找头⽂件,slice中所有的定义都必须放到module中,不能在全局定义特别的要提到Ice module, 基本上所有的Ice run time时的API, 都是在以slice的形式定义和表达的,在module Ice { }中,⽐如我们下⾯提到的communicator是⼀个slice的interface slice中的类型有basic types , user-defined types(enum, structure, sequence, dictionary), sequence<type>, dictionary<type,type>在c++中被映射为vector和mapinterface是slice中最中⼼最关注的东西了,通过proxy调⽤⼀个operation则就由Ice run time向⽬标object发送了⼀个message, 4.10.4讲了ice所定义的exception的层次结构,根处是Ice::Exception,应该是Ice⾃⼰⽤Slice定义的吧,不知道映射到C++中是不是std::Exception,interface可以⽤extends来派⽣, interface Thing extends BaseThing {}class的内容很丰富,后⾯看,有和interface,struct的⽐较。
参考《Ice 分布式程序设计》马维达译一、main函数Ice run time 的主要进入点main函数的主体结构如下:package Demo;public class Server {public static void main(String[] args) {int status = 0;municator ic = null;try {ic = Ice.Util.initialize(args);//...} catch (Ice.LocalException e) {e.printStackTrace();status = 1;} catch (Exception e) {System.err.println(e.getMessage());status = 1;}if (ic != null) {try {ic.destroy();} catch (Exception e) {System.err.println(e.getMessage());status = 1;}}System.exit(status);}}初始化函数Ice.Util.initialize 接受的参数向量是由操作系统传给main 的。
这个函数扫描参数向量,查找任何与Ice run time 有关的命令行选项,但不会移除这些选项。
如果在初始化过程中出了任何问题, initialize 会抛出异常。
在离开main 函数之前,必须调用Communicator.destroy()。
destroy 操作负责结束Ice run time。
特别地,destroy 会等待任何还在运行的操作调用完成。
此外, destroy 还会确保任何还未完成的线程都得以汇合,并收回一些操作系统资源,比如文件描述符和内存。
决不要让main 函数不先调用destroy 就终止;这样做会导致不确定的行为。
注意,这段代码把对Ice.initialize 的调用放在了try 块中,并且会负责把正确的退出状态返回给操作系统。
Ice方案1. 概述在计算机科学领域,Ice(Internet Communications Engine)是一种面向对象的分布式计算平台,它提供了一种简单而强大的方式来实现分布式应用的开发。
Ice使用一种特定的接口定义语言(IDL)来描述分布式应用程序的接口,然后自动生成客户端和服务器端的代码。
通过使用Ice,开发人员可以轻松地在不同的计算机或操作系统之间进行通信。
Ice具有以下几个主要特点:•面向对象:Ice基于面向对象的编程模型,可以方便地创建分布式对象,并通过远程调用来访问和操作这些对象。
•平台无关性:Ice支持跨平台的开发,可以运行在多种不同的操作系统和编程语言上。
•异步通信:Ice支持异步通信模式,可以提高系统的性能和并发能力。
•安全性:Ice提供了多种安全机制,可以确保通信的机密性和数据的完整性。
2. Ice的基本概念2.1 接口定义语言(IDL)IDL是Ice中用来描述分布式应用程序接口的语言。
开发人员可以使用IDL来定义自己的接口,包括对象的属性、方法、异常等。
Ice的IDL非常类似于其他编程语言中的接口定义,但它是独立于任何编程语言的。
Ice会根据IDL文件自动生成客户端和服务器端的代码。
以下示例是一个简单的IDL文件的例子:module MyModule {struct MyStruct {string name;int age;};interface MyInterface {void sayHello();MyStruct getInfo();};};2.2 代理和对象适配器在Ice中,客户端通过代理来访问远程对象。
代理是客户端调用的一个本地对象,它负责将方法调用转发给远程对象,并将结果返回给客户端。
服务器端使用对象适配器来注册和激活对象,并将对象与特定的网络地址绑定。
对象适配器可以理解为一个“中间人”,它负责接收客户端的请求,并将其转发给实际的对象进行处理。
2.3 通信协议和传输方式Ice支持多种通信协议和传输方式。
功能FANUC α-1ice格式G04暂停(指定时间停止G04 P-- or G04 x--G92设定坐标系G92 X--Y--I--J--G93设定局部坐标系G93 X--Y--G28机床原点(参考位置)返回G28 X--Y--U--V--G29从参考位置返回G29 X--Y--U--V--G30第二第三第四参考位置返回G30 P--X--Y--U--V--G32参考位置设定-A G32 P- (设定当前位置)G33参考位置设定-B G33 P--X--Y--U--V-- (设定任意位置) G53在机床坐标定位G53 X--Y--U--V--G10设定偏置或加工条件G10 P--R-- (设定偏置) G10 P--X-Y-Z-U-V-W-I-J-K-(设定加工条件)G11设定加工条件G11 P--X-Y-Z-U-V-W-G00快速移动G00 X--Y--U--V--G01直线插补(加工进给)G01 X--Y--U--V--G02圆弧插补(顺时针旋转)G02 X--Y--I--J--U--V--K--L--G03圆弧插补(逆时针旋转)G03 X--Y--I--J--U--V--K--L--G17指定平面(XY平面)G17G90绝对指令G90 (绝对坐标指令)G91增量指令G91 (相对坐标指令)G22软限制ON G22 X--Y--I--J--G23软限制OFF G23G94定速进给G94 X--Y--F--G95伺服进给G95 X--Y--G20英制输入G20G21米制输入G21G40取消偏置G40 X--Y--G41偏置左G41 X--Y--G42偏置右G42 X--Y--G50取消锥度倾斜G50 X--Y--G51锥度倾斜方向左G51 X--Y--G52锥度倾斜方向右G52 X--Y--G60上下独立转角R G60 R----K----G61圆锥形转角R G61 R----G62圆锥形转角R G62 R----G63圆锥形转角R G63 R----G48插入自动转角R ON G48G49插入自动转角R OFF G49G54工件偏置的指令(工件坐标系)G54 or G54 P--G55P02的工件偏置的指令(工件坐标系)G55G56P03的工件偏置的指令(工件坐标系)G56G57P04的工件偏置的指令(工件坐标系)G57G58P05的工件偏置的指令(工件坐标系)G58G59P06的工件偏置的指令(工件坐标系)G59G70端面定位G70 P--X-- or G70 P--Y-- or G70 P--B--G71孔中心定位G71 P--X--B-- or G71 P--Y--B--代码P480G72凹槽中心定位G72 P--X-- or G72 P--Y--G74定位到圆中心 Pn G74 P-G75在相对坐标系定位G75 X--Y--G76定位到端面定位点G76 P--X--Y--G77定位到定位点G77 P--X--Y--G78定位到工件的角部G78 X--Y--G79计算工件倾角\计算圆中心Pn G79 Q--B-- G79 Pn BO or G79 pn B1 X--Y--G170端面定位(高精度定位)G170P--X-- or G70 P--Y--G171孔中心定位(高精度定位)G171P--X-- or G70 P--Y--G172凹槽中心定位(高精度定位)G172P--X-- or G70 P--Y--G174保存工件坐标系位置G174 P--X--Y--G65用户宏程序调用G65 P---- L--自变量1 自变量2…G66宏程序连续调用 ON G66 P---- L--自变量1 自变量2…G67宏程序连续调用 OFF G67。
ICE资料整理概念ICE: (The Internet Communications Engine)互联网通信引擎。
是由前CORBA专家开发的新一代面向对象中间件,ICE之轻量级分布式通讯中间件。
介绍:ICE是一种面向对象的中间件平台。
从根本上说,这意味着Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。
Ice 应用适合于异构平台环境中使用:客户和服务器可以采用不同的编程语言,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。
无论部署环境如何,这些应用的源码都是可移植的。
其采用C/S 模式结构,支持同步调用方式和异步调用方式,异步派发调用方式。
支持跨语言的对象调用。
多种语言之间采用共同的Slice(Specification Language for Ice)进行沟通。
支持ice到C,JAVA,C#,VB,Python,Ruby,PHP等多种语言的映射。
Ice源代码发布包包含一系列的第三方产品(Berkeley DB,bzip2/libbzip2,The OpenSSL Toolkit,SSLeay,Expat,STLport,mcpp)。
特点:1.平台无关性。
无论客户端或者服务端均可用现在流行的开发语言(C++ /JAVA/C#/php)进行开发,并且屏蔽语言差异性。
现在比较流行的方式是客户端用C#开发,与用C++开发的服务端直接通讯。
2.通讯协议多样性。
现在可选择TCP、UDP、HTTP进行通讯,如果对安全要求较高,可选择SSL对传输的数据进行加密。
3.Ice具有丰富的特性。
其性能远是基于jms 所不能比的。
4.ICE注重的是通讯,异构平台,多语言之间,支持远程对象的通讯中间件。
Ice个人整理资料1.客户与服务器(Clients and Servers)2.Ice 对象(Ice Objects )3.代理(Proxies )4.串化代理(Stringified Proxies )代理中的信息可以用串的形式表示。
例如:SimplePrinter:default -p 100005.直接代理(Direct Proxies )协议标识符(比如TCP/IP 或UDP)针对具体协议的地址(比如主机名和端口号)6.间接代理(Indirect Proxies)7. 同步方法调用(Synchronous Method Invocation)8. 异步方法调用(Asynchronous Method Invocation)9. 异步方法分派(Asynchronous Method Dispatch)10. 单向方法调用(Oneway Method Invocation )11. 成批的单向方法调用(Batched Oneway Method Invocation )12. 数据报调用(Datagram Invocations)13. 成批的数据报调用(Batched Datagram Invocations)14. 运行时异常(Run-Time Exceptions )15. 用户异常(User Exceptions )16. 属性(Properties )17. 骨架(skeleton)代码也是根据你的Slice 定义生成的,因此,与你用Slice 定义的对象和数据的类型是对应的。
骨架代码是客户端代理代码的服务器端等价物:它提供了向上调用(up-call)接口,允许Ice runtime 把控制线程转交给你编写的应用代码。
骨架也含有整编和解编代码,所以服务器可以接收客户发送的参数,并把参数和异常返回给客户。
18. 对象适配器(object adapter)是专用于服务器端的Ice API 的一部分:只有服务器才使用对象适配器。
ICE专题ICE简介ICE(Internet Communications Engine)是一个为现实中程序员而写的中间件平台。
作为一个高性能的互联网通信平台,ICE包含了很多分层的服务和插件(Plug-ins),并且简单、高效和强大。
ICE的自由使用遵从GNU的GPL(GNU General Public Licens)许可的条款。
ICE 也有商业的许可证,如果你想将ICE使用在你的私有产品中,那么你应该使用ICE的商业许可证。
可以联系sales@来获得这方面的更多信息。
ICE当前支持C++、Java、C#、Visual Basic、Python和PHP编程语言,并支持在多种操作系统上运行。
更多的操作系统和编程语言将会在以后的发布中支持。
ICE有以下几部分组成:SliceICE的规范语言,跟CORBA的IDL(Interface Definition Language)等价的东西。
Slice建立了客户端和服务器端共同遵守的契约:接口。
Slice也用来描述对象持久数据。
Slice CompilersSlice的规范语言可以影射成多种编程语言。
目前ICE支持C++,Java,Python,PHP,C#和VB的语言影射。
Ice的客户端和服务器端协同工作,而不会知道分别实现的是何种编程语言。
IceIce的核心库。
在众多的特性当中,Ice核心库通过一个高效的协议(包含TCP/UDP 层上协议压缩)来管理所有的通信任务,为多线程服务器提供了一个灵活的线程池,并且有特别的功能来支持上百万对象的可扩展性。
IceUtil一些常用的功能函数集。
例如Unicode处理和多线程编程,是用C++写成。
IceBox一个专用于ICE应用的应用服务器。
ICEBox可以方便地运行和管理动态加载、共享库或java类的形式Ice的服务。
IcePack一个成熟的服务激活和部署工具。
IcePack能大大简化在异构网络之间部署应用的复杂性。
ICE中间件技术详细教程一、ICE中间件概述ICE中间件是一种基于网络的通信框架,它允许不同机器上的应用程序进行通信,并提供了高性能和可扩展性。
ICE基于面向对象的编程模型,将通信对象抽象为接口,并通过接口定义通信协议,从而隐藏了底层通信细节,使开发者可以专注于业务逻辑的实现。
ICE中间件支持多种编程语言,包括C++, Java, Python等,这使得开发者可以使用自己熟悉的编程语言来开发分布式应用程序。
ICE中间件还提供了丰富的工具和库,以便开发者可以更加方便地开发和调试应用程序。
二、ICE中间件的安装和配置安装完成后,需要配置ICE的环境变量。
在Windows系统下,可以在系统环境变量中添加ICE_HOME变量,并将ICE的安装路径作为其值。
在Linux系统下,可以在.bashrc文件中添加exportICE_HOME=/path/to/ice命令。
完成配置后,重新启动终端使其生效。
三、ICE中间件的基本使用在ICE中,应用程序之间的通信是通过接口进行的。
首先,需要定义接口,并使用Slice语言编写其接口规范。
Slice语言是一种专门为ICE设计的领域特定语言,用于定义接口的数据类型和方法。
例如,以下是一个简单的Slice接口定义:```slicemodule MyModuleinterface MyInterfacevoid sayHello(;};};```接口定义完成后,可以使用Slice编译器将其编译为不同语言的接口代码。
例如,可以使用slice2java命令将上述接口编译为Java代码。
接口代码生成后,可以在应用程序中使用该接口。
首先,需要创建ICE运行时环境并初始化。
然后,可以通过接口代理创建一个远程对象。
远程对象代表了另一个应用程序中的接口对象,可以通过它来调用远程接口的方法。
以下是一个简单的Java示例代码:```javaimport MyModule.*;public class Mainpublic static void main(String[] args)MyInterfacePrx myInterface =MyInterfacePrx.checkedCast(proxy);if (myInterface == null)throw new Error("Invalid proxy");}myInterface.sayHello(;}}```上述代码中,通过调用stringToProxy方法创建一个接口代理。
服务器端代码:主要包括几个大的类。
Ice::Communicator类:
Ice run time的主要进入点是由本地接口
Ice::Communicator来表示的。
和在客户端一样,在你在服务器中做任何别的事情之前,你必须调用
Ice::initialize,对Ice run time进行初始化。
Ice::initialize 返回一个智能指针,指向一个Ice::Communicator实例:int main(int argc, char * argv[])
{
Ice::CommunicatorPtr ic = Ice::initialize(argc, argv); // ...
}
在离开你的main函数之前,你必须调用Communicator::destroy。
destroy操作负责结束Ice run time。
特别地,destroy会等待任何还在运行
的操作调用完成。
此外,destroy还会确保任何还未完成的线程都得以汇合(joined),并收回一些操作系统资源,比如文件描述符和内存。
决不要让你的main函数不先调用destroy就终止;这样做会导致不确定的行为。
Ice::Application类:
#include <Ice/Ice.h>
class MyApplication : virtual public Ice::Application { public:
virtual int run(int, char * []) { //主要是来实现该run 的方法。
// Server code here...
return 0;
}
};
int
main(int argc, char * argv[])
{
MyApplication app;
return app.main(argc, argv);
}
Ice::Service类:
使用Ice::Service类的Ice应用至少要定义一个子类,并重新定义 start成员函数;服务必须在这个函数里执行其启动活动,比如处理命令
行参数、创建对象适配器、注册servants。
应用的main 函数必须实例化这个子类,调用其main成员函数,把程序的参数向量作为参数传给它。
下面的例子给出了一个最小限度的Ice::Service子类:
#include <Ice/Ice.h>
#include <Ice/Service.h>
class MyService : public Ice::Service {
protected:
virtual bool start(int, char * []);
private:
Ice::ObjectAdapterPtr _adapter;
};
bool MyService::start(int argc, char * argv[])
{
_adapter
= communicator()->createObjectAdapter("MyAdapt er");
_adapter->addWithUUID(new MyServantI); //用UUID来指定1个servant。
_adapter->activate(); //1个适配器包含1个servant还是多个?
return true;
}
int main(int argc, char * argv[])
{
MyService svc;
return svc.main(argc, argv);
}
linux守护进程命令行:--daemon,--noclose(阻止ice::service关闭无用的文件描述符),--nochdir(阻止ice::service变更当前目录)
Servant类:继承于ice::object类。