做外贸的数据网站有哪些,选择做印象绍兴网站的原因,东莞网站制作电话,做网站会犯法吗1、ICE是什么#xff1f; ICE是ZEROC的开源通信协议产品#xff0c;它的全称是#xff1a;The Internet Communications Engine#xff0c;翻译为中文是互联网通信引擎#xff0c;是一个面向对象的中间件#xff0c;使我们能够以最小的代价构建分布式应用程序。ICE使我们… 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三 种不同于WebServiceICE在调用模式上有好几种选择方案并且每种方案正对不同的网络协议的特性做了相应的选择。 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安装及配置参考如下 WINDOWShttp://blog.csdn.net/fenglibing/archive/2011/04/28/6368665.aspx LINUXBDB的安装还有问题无法使用SLICE2JAVAhttp://blog.csdn.net/fenglibing/archive/2011/04/27/6367559.aspx 这个示例是JAVA示例是从ICE的帮助文档中摘出来的是一个输出Hello World的测试程序采用的ICE版本是3.1.1。 1、准备一个ice文件并命名为Printer.ice其内容为 [cpp] view plaincopy module Demo { interface Printer { void printString(string s); }; }; 2、转到命令行在Printer.ice文件保存目录执行命令 slice2java Printer.ice 会在目录下面生成一个Demo 文件夹里面会生成一些JAVA文件如下图示 3、这些文件的类图结构如下 这里对生成的一些文件做些解释分两两部份服务端类文件及客户端类文件 • interface-name.java 这个源文件声明在ICE文件中定的接口名称的Java接口如这里是Printer。 • _interface-nameOperations.java _interface-nameOperationsNC.java 这是两个定义操作的接口文件每个接口文件中定义了一个操作实现定义的操作与Slice接口中定义的操作相一致只是在_interface-nameOperations.java中定义的方法多了一个参数“Ice.Current __current”注Current对象的定义请参见3.1.1版本文档中的31.6 The Ice::Current Object说明这个参数的作用是可以允许我们访问 “正在执行的请求”和 “服务器中的操作的实现”等信息也就是我们的请求需求需要其它请求的支持时或者要获取其它请求的执行结果时我们可以调用这个方法这两个接口文件都会被接口文件_interface-name.java继承。 • _interface-nameDisp.java 这个文件包含的是服务器端骨架类的定义所用接口定义都要继承这个东西这里的接口指供客户端调用的接口。 • interface-namePrxHolder.java 代理定义holder 类是对应Out参数使用的。一般参数都是值传递这个类的作用是使参数通过引用传递。ICE框架应用了很多反射机制这个类是改变远程参数的一个映射。 • _interface-nameDel.java • _interface-nameDelD.java • _interface-nameDelM.java 不用关心上面的这些文件这些文件包含的是供Java 映射内部使用的代码它们包含的功能与应用程序无关。 • interface-namePrx.java 这个是代理接口。例如PrinterPrx在客户的地址空间中 PrinterPrx 的实例是“远地的服务器中的Printer接口的实例”的“本地大使”。与服务器端对象有关的所有细节比如其地址、所用协议、对象标识都封装在该实例中。 注意 PrinterPrx 继承自Ice.ObjectPrx。这反映了这样一个事实所有的Ice 接口都隐式地继承自Ice::Object。 说的更明白些就是这个类的方法调用都是远程服务端的调用执行printString()方法的具体实现是在远程服务端执行的。 • interface-namePrxHelper.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参数 [java] view plaincopy public class PrinterI extends Demo._PrinterDisp { public void printString(String s, Ice.Current current) { System.out.println(s); } } Server.java是服务端服务代理用于接收客户端的请求操作 [java] view plaincopy public class Server { public static void main(String[] args) { int status 0; Ice.Communicator ic null; try { //初使化连接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 // try { ic.destroy(); } catch (Exception e) { System.err.println(e.getMessage()); status 1; } } System.exit(status); } } Client.java是客户端代码用于向服务端发起请求并操作返回的代理对象 [java] view plaincopy public class Client { public static void main(String[] args) { int status 0; Ice.Communicator ic null; try { //初使化 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 // try { 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这些留待大家后面去学习了。 本文出自冯立彬的博客 原始网页:http://blog.csdn.net/fenglibing/article/details/6372444