<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
ICE 文档翻译(部分,基于3.3.1 )
Printer.ice
内容
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://you-meng.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=module%20demo%7B%0A%20%20%20%20interface%20Printer%7B%0A%20%20%20%20%20%20%20%20void%20printString(string%20s)%3B%0A%20%20%20%20%7D%3B%0A%7D%3B"></embed>
- module demo{
- interface Printer{
- void printString(string s);
- };
- };
3.4. 书写一个简单的java 应用程序
这个模块向我们展示了我们将如何基于java 实现一个简单的ICE 应用
1. 编译基于java 的slice 声明
第一步是创建一个基于java 应用的简单的slice 声明,在linux 下面你可以使用面的方法来实现:
$ mkdir generated
$ slice2java --output-dir generated Printer. ice
其中 –output-dir 选项的意义是指定你用slice2java 命令生成的代码的路径,上文的意义是将代码生成在当前目录的generated 下面。如果不出意外的话你会发现slice2java 命令执行完后为你生成了一些javasource 文件,我们不必关心其中的细节,但是我们必须知道他为我们生成了我们在Printer.ice 中定义的Printer 接口(_PrinterDisp ),接下来的实现,将会继承这个类。
2. 书写服务器端的代码:
用slice 声明好我们服务端的类以后,我们必须得创建一个属于自己的class ,供服务器端调用,下面的是死规定:这个类的类名必须使用我们的定义的接口名+I 的后缀(即PrinterI )而且必须继承_PrinterDisp 类。_PrinterDisp 是抽象类,他里面有个方法,正是你在Printer.ice中定义的那个方法名,你要在这个方法里添加你想要实现的代码。这里我们实现的很简单,仅仅是让他打印从客户端接收到的字符串而已。
完整的服务前端代码如下:
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://you-meng.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=public%20class%20Server%20%7B%0A%0Apublic%20static%20void%0A%0Amain(String%5B%5D%20args)%0A%0A%7B%0A%0Aint%20status%20%3D%200%3B%0A%0AIce.Communicator%20ic%20%3D%20null%3B%0A%0Atry%20%7B%0A%0Aic%20%3D%20Ice.Util.initialize(args)%3B%0A%0AIce.ObjectAdapter%20adapter%0A%0A%3D%20ic.createObjectAdapterWithEndpoints(%0A%0A%22SimplePrinterAdapter%22%2C%20%22default%20-p%2010000%22)%3B%0A%0AIce.Object%20object%20%3D%20new%20PrinterI()%3B%0A%0Aadapter.add(%0A%0Aobject%2C%0A%0Aic.stringToIdentity(%22SimplePrinter%22))%3B%0A%0Aadapter.activate()%3B%0A%0Aic.waitForShutdown()%3B%0A%0A%7D%20catch%20(Ice.LocalException%20e)%20%7B%0A%0Ae.printStackTrace()%3B%0A%0Astatus%20%3D%201%3B%0A%0A%7D%20catch%20(Exception%20e)%20%7B%0A%0ASystem.err.println(e.getMessage())%3B%0A%0Astatus%20%3D%201%3B%0A%0A%7D%0A%0Aif%20(ic%20!%3D%20null)%20%7B%0A%0A%2F%2F%20Clean%20up%0A%0A%2F%2F%0A%0Atry%20%7B%0A%0Aic.destroy()%3B%0A%0A%7D%20catch%20(Exception%20e)%20%7B%0A%0ASystem.err.println(e.getMessage())%3B%0A%0Astatus%20%3D%201%3B%0A%0A%7D%0A%0A%7D%0A%0ASystem.exit(status)%3B%0A%0A%7D%0A%0A%7D%20"></embed>
- public class Server {
-
- public static void
-
- main(String[] args)
-
- {
-
- int status = 0;
-
- Ice.Communicator ic = null;
-
- try {
-
- ic = Ice.Util.initialize(args);
-
- Ice.ObjectAdapter adapter
-
- = ic.createObjectAdapterWithEndpoints(
-
- "SimplePrinterAdapter", "default -p 10000");
-
- Ice.Object object = new PrinterI();
-
- adapter.add(
-
- object,
-
- ic.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) {
-
-
-
-
-
- try {
-
- ic.destroy();
-
- } catch (Exception e) {
-
- System.err.println(e.getMessage());
-
- status = 1;
-
- }
-
- }
-
- System.exit(status);
-
- }
-
- }
注意这个代码的结构。
main 方法中包含了2 个try 模块,我们在其中实现了自己的全部的服务器端的代码,其中第一个我们catch 住了ICE 可能抛出的运行时异常,我们的目的是如果ICE 遇到了某种运行时异常,我们就把完整的堆栈打印出来并且返回main 方法,这时虚拟机就会被告知发生了异常并且会退出程序。第二个异常是完全无法预料的,如果发生了我们同样也会告知程序退出。
当程序退出之前,我们先要销毁communicator 对象(当然前提是我们已经正确创建了这个对象),这样做可以正确的终止ICE 运行时,否则后果自负。
第一个try 模块包含的如下代码:
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://you-meng.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%20ic%20%3D%20Ice.Util.initialize(args)%3B%0A%0AIce.ObjectAdapter%20adapter%20%3D%20ic.createObjectAdapterWithEndpoints(%20%22SimplePrinterAdapter%22%2C%20%22default%20-p%2010000%22)%3B%0A%0AIce.Object%20object%20%3D%20new%20PrinterI()%3B%0A%0Aadapter.add(%20object%2C%20ic.stringToIdentity(%22SimplePrinter%22))%3B%0A%0Aadapter.activate()%3B%0A%0Aic.waitForShutdown()%3B%20"></embed>
- ic = Ice.Util.initialize(args);
-
- Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints( "SimplePrinterAdapter", "default -p 10000");
-
- Ice.Object object = new PrinterI();
-
- adapter.add( object, ic.stringToIdentity("SimplePrinter"));
-
- adapter.activate();
-
- ic.waitForShutdown();
这段代码经历了以下步骤:
*. 通过执行Ice.Util.initialize 方法我们初始化了ICE 服务(我们传递了args 参数,以防服务初始化时需要什么参数。),成功以后将会返回ICE 运行时的主句柄Ice::Communicator 对象。
*. 我们通过调用在Communicator 之上的createObjectAdapterWithEndpoints 方法,创建了一个对象adapter ,命名为“SimplePrinterAdapter”,和adapter 对象的默认监听端口“default -p 10000” ,端口为10000, 一目了然。
*. 接下来就是服务端运行时的初始化并且我们通过实力化PrinterI 对象实现了Printer 的接口。
*. 我们通过执行add 方法来通知这个adapter ,ICE 添加了新的服务,被添加的参数一定是要经过初始化的才可以,这个服务的名字叫做“SimplePrinter” (如果有多个printers ,每一个都要被命名成新的不同名字,并且还添加新的服务名称。也就相当于你添加了新的服务给ICE )。
*. 最后我们的waitForShutdown. 方法就是让ICE 线程挂起,直到你调用关闭运行时的方法,或者通过信号响应(貌似翻译的不对)(到目前位置我们只能手动kill 了。)
请注意,即使只有上面的哪一点点代码,也已经适用于几乎所有的server 了(几乎所有的服务声明都是这样的),你可以把那段代码放入一个Helper 类,然后你以后开发的时候就再也不用去每次都书写那些代码了。我们可以用如下方法编译:
$ mkdir classes
$ javac -d classes -classpath classes:$ICEJ_HOME/lib/Ice.jar -source 1.4 Server.java PrinterI.java generated/Demo/*.java
当然我本人比较推荐eclipse 或者其他的可以自动编译的工具。
上面的命令将编译我们通过slice 生成的代码, 我们定义了ICEJ_HOME 环境变量作为包含ICE 运行库环境的根目录(例如:如果你把ICE安装在/opt/IceJ 目录下,那么你的$ICEJ_HOME 的意义就是表示目录/opt/IceJ ),另外需要注意的是ICE 所有java 代码都是使用ant 编译的,关于ant 不懂的话可以看看ICE 的Demo 或者或者google 一下。
客户端代码如下:
客户端的代码看起来有点像服务器端的代码:
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://you-meng.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=public%20class%20Client%20%7B%0A%0Apublic%20static%20void%0A%0Amain(String%5B%5D%20args)%0A%0A%7B%0A%0Aint%20status%20%3D%200%3B%0A%0AIce.Communicator%20ic%20%3D%20null%3B%0A%0Atry%20%7B%0A%0Aic%20%3D%20Ice.Util.initialize(args)%3B%0A%0AIce.ObjectPrx%20base%20%3D%20ic.stringToProxy(%0A%0A%22SimplePrinter%3Adefault%20-p%2010000%22)%3B%0A%0ADemo.PrinterPrx%20printer%0A%0A%3D%20Demo.PrinterPrxHelper.checkedCast(base)%3B%0A%0Aif%20(printer%20%3D%3D%20null)%0A%0Athrow%20new%20Error(%22Invalid%20proxy%22)%3B%0A%0A%0Aprinter.printString(%22Hello%20World!%22)%3B%0A%0A%7D%20catch%20(Ice.LocalException%20e)%20%7B%0A%0Ae.printStackTrace()%3B%0A%0Astatus%20%3D%201%3B%0A%0A%7D%20catch%20(Exception%20e)%20%7B%0A%0ASystem.err.println(e.getMessage())%3B%0A%0Astatus%20%3D%201%3B%0A%0A%7D%0A%0Aif%20(ic%20!%3D%20null)%20%7B%0A%0A%2F%2F%20Clean%20up%0A%0A%2F%2F%0A%0Atry%20%7B%0A%0Aic.destroy()%3B%0A%0A%7D%20catch%20(Exception%20e)%20%7B%0A%0ASystem.err.println(e.getMessage())%3B%0A%0Astatus%20%3D%201%3B%0A%0A%7D%0A%0A%7D%0A%0ASystem.exit(status)%3B%0A%0A%7D%0A%0A%7D%20"></embed>
- public class Client {
-
- public static void
-
- main(String[] args)
-
- {
-
- int status = 0;
-
- Ice.Communicator ic = null;
-
- try {
-
- ic = Ice.Util.initialize(args);
-
- Ice.ObjectPrx base = ic.stringToProxy(
-
- "SimplePrinter:default -p 10000");
-
- Demo.PrinterPrx printer
-
- = Demo.PrinterPrxHelper.checkedCast(base);
-
- if (printer == null)
-
- throw new</
分享到:
相关推荐
**Ice入门例子详解** Ice(又称为ZeroC Ice)是一种高性能、跨平台的分布式对象中间件,它提供了灵活、安全的远程过程调用(RPC)框架。本篇将基于提供的"ice入门例子"进行深入讲解,帮助初学者理解Ice的基本概念、...
《ICE入门文档》是针对ICE通信中间件的一份详尽指南,由Michi Henning和Mark Spruiell等人编著,并由马维达翻译。ICE(Internet Communications Engine)是一种分布式程序设计工具,它允许开发者构建跨平台、高性能...
Zeroc ICE是一个开源的中间件平台,它支持C++、Java、Python、.NET等语言的分布式对象通信。ICE全称Internet Communications Engine,即互联网通信引擎,是一种用于开发分布式计算应用的强大工具。本文档主要围绕ICE...
这是继ice入门例子的第二个例子,主要讲述Ice.Application与配置文件的简单使用 所需jar在lib中 这个例子中集成了日志插件,在服务器启动时,该插件会工作一次, 文件名:config.server 服务端配置文件 #配置...
《HelloWorld_ICE分布式应用开发入门_MichiHenning.pdf》这篇文章很可能是介绍ICE的基础知识,包括如何安装ICE,以及通过一个简单的"Hello, World!"程序来演示ICE的基本用法。开发者Michi Henning可能会讲解ICE的...
【Ice入门完整实例】是一个针对初学者的教程,旨在引导用户了解并掌握Ice中间件的基本用法和开发流程。在本实例中,我们将深入探讨Ice,一个强大的分布式对象框架,它提供了一种高效的、跨平台的方式来构建分布式...
1. **ICE简介**:ICE是由ZeroC公司开发的,它提供了丰富的接口,支持多种编程语言,如C++、Java、Python等。ICE的主要功能是提供可靠的网络通信和对象间交互,它的设计目标是简化分布式系统的开发,提高其可扩展性和...
在这个“ICE入门代码”中,我们可以深入理解ICE的基本概念和使用方法。 首先,让我们了解一下ICE的核心特性: 1. **对象透明性**:ICE支持远程对象调用,就像调用本地对象一样简单,隐藏了网络通信的复杂性。 2. **...
总的来说,"Ice经典入门和实例"是一套完整的学习资料,涵盖了Ice的基本概念、核心功能、高级特性和实战应用,对于想要掌握这个分布式对象中间件的开发者来说,是非常宝贵的资源。通过深入学习和实践,你将能熟练地...
zero ICE快速入门文档, ice是最优秀的rpc框架。 4、开发服务端代码如下 步骤一:编写Servant类即带有Disp的存根文件也就是说继承_HelloWorldDisp 这个类,这个类是个抽象类定义如下: public abstract class _...
**中间件技术:ICE 入门介绍** ICE(Internet Communications Engine)是一种专为现实世界中的程序员设计的中间件平台,其目标是提供一种高性能、高效且功能强大的互联网通信解决方案。ICE 不仅包含了丰富的分层...
ice入门教程 - 马达维译 很经典的ice教程,完全版
【ICE入门指南-分布式开发】 本文档是一份简明易懂的ICE(Internet Communication Engine)入门教程,旨在帮助初学者快速掌握ICE的使用方法,包括如何设置开发环境、配置编译参数以及创建并运行基本的分布式应用...
### ICE介绍与开发入门 #### 一、ICE概述 ##### 1.1 什么是ICE ICE(Internet Communications Engine)是一款由ZeroC公司开发的高性能、跨平台、支持多种编程语言的中间件产品。ICE主要用于构建分布式应用程序,...
### HelloWorld_ICE分布式应用开发入门 #### 概述 本文旨在通过一个简单的示例来介绍如何使用ICE(Internet Communications Engine)进行分布式应用开发。ICE是一种强大的中间件框架,用于构建可扩展、健壮且高...
总的来说,"ICE例子(非常简单,使大家方便入门)"是一个很好的起点,通过它,初学者可以快速掌握ICE的基本用法,并逐步深入到更复杂的分布式系统开发中去。记住,实践是检验知识的最好方式,动手尝试并不断调试,你...
讲述了ice详细的部署过程,让新手从0开始
1. **中文教程**:这部分内容可能包含一系列的中文教学材料,帮助中文读者更方便地理解和学习 ICE 的基本概念、原理和使用方法。教程可能涵盖诸如服务发布、客户端连接、数据序列化等主题,是初学者的入门佳选。 2....
ICE(Internet Communication Engine)是一种高性能、跨平台的分布式中间件,它主要用于构建大规模的网络应用程序。...这是一个很好的起点,可以帮助初学者快速入门ICE,并为实际项目中的应用打下基础。
在Ubuntu系统上安装Zeroc-ICE环境主要涉及以下知识点: ...安装Zeroc-ICE是进行相关开发或者搭建分布式系统的前提,因此对于想要在Ubuntu环境下利用Zeroc-ICE进行开发的用户来说,这些步骤是入门级别的必要知识。