文档章节

ZeroC ICE之旅------java

李长春
 李长春
发布于 2011/12/01 10:21
字数 1635
阅读 4609
收藏 4

关于Ice请见,
ICE之轻量级分布式通讯中间件
http://masterkey.iteye.com/blog/182954
ZeroC ICE之旅------C++
http://masterkey.iteye.com/blog/183307
ZeroC ICE之旅------Slice
http://masterkey.iteye.com/blog/184064
ZeroC ICE之旅------多语言互通互联
http://masterkey.iteye.com/blog/183742
ZeroC ICE之旅------集群和容错
http://masterkey.iteye.com/blog/185081
更多ICE文章,请关注:
Titan的天空
http://masterkey.iteye.com

工欲善其事,必先利其器,我们首先从www.zero.com,下载最新安装包;
btw:

目前最新的v3.4
http://www.zeroc.com

最新稳定版本:
http://www.zeroc.com/download.html


由于我自己的平台是CentOS release 5.3 (Final),java version "1.6.0_01"
所以下载的是:
http://www.zeroc.com/download/Ice/3.4/Ice-3.4.2-rhel5-x86_64-rpm.tar.gz
解开之后:
-rw-r--r-- 1 222 mysql 1341046 Jun  4  2010 db48-4.8.30-1ice.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql   51886 Jun  4  2010 db48-devel-4.8.30-1ice.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql 1180156 Jun  4  2010 db48-java-4.8.30-1ice.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql  120935 Jun  4  2010 db48-utils-4.8.30-1ice.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql   91574 Jun 16 05:36 ice-3.4.2-1.rhel5.noarch.rpm
-rw-r--r-- 1 222 mysql  531513 Jun 16 05:36 ice-c++-devel-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql 2837924 Jun 16 05:36 ice-java-3.4.2-1.rhel5.noarch.rpm
-rw-r--r-- 1 222 mysql  282937 Jun 16 05:36 ice-java-devel-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql 3371844 Jun 16 05:36 ice-libs-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql  200760 Jun 16 05:36 ice-php-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql   65172 Jun 16 05:36 ice-php-devel-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql 1069585 Jun 16 05:36 ice-python-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql   32678 Jun 16 05:36 ice-python-devel-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql  238228 Jun 16 05:36 ice-ruby-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql   25797 Jun 16 05:36 ice-ruby-devel-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql 3301850 Jun 16 05:36 ice-servers-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql  175745 Jun 16 05:36 ice-sqldb-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql 4545116 Jun 16 05:36 ice-utils-3.4.2-1.rhel5.x86_64.rpm
-rw-r--r-- 1 222 mysql   97474 Jun  4  2010 mcpp-devel-2.7.2-2ice.rhel5.x86_64.rpm

由于需要c和java的包:
所以我们仅安装:

irpm -ivh ce-3.4.2-1.rhel5.noarch.rpm

irpm -ivh  db48*
rpm -ivh ice-libs-3.4.2-1.rhel5.x86_64.rpm
rpm -ivh ice-utils-3.4.2-1.rhel5.x86_64.rpm
rpm -ivh mcpp-devel-2.7.2-2ice.rhel5.x86_64.rpm
rpm -ivh ice-servers-3.4.2-1.rhel5.x86_64.rpm
rpm -ivh ice-c++-devel-3.4.2-1.rhel5.x86_64.rpm
rpm -ivh ice-java*

安装之后的Ice相关路径:
/usr/bin/下有:

slice2cpp
slice2freeze
slice2freezej
slice2html
slice2java

 
存储于 /usr/share/java/下 有:

nt-ice-3.4.2.jar  db-4.8.30.jar     Freeze.jar     IceGridGUI-3.4.2.jar  Ice.jar
ant-ice.jar        Freeze-3.4.2.jar  Ice-3.4.2.jar  IceGridGUI.jar


相关的Ice的库存储于/usr/lib下.

一切就绪,我们开始Ice之旅的Slice地带:
首先,我们建立一个demo.ice的文件:

Java代码 复制代码  收藏代码
  1. module Demo{   
  2. interface test{   
  3.  string   execute(string mth,string cmd);   
  4. };   
  5. };  

注意string 确实是小写(java开发人员注意)

module Demo{
interface test{
 string   execute(string mth,string cmd);
};
};


注意,后两个"}"一定要包含";",否则slice2java就会过不去,赫赫
执行:
slice2java demo.ice

会在当前目录产生一个Demo目录,目录下自动生成: 
-rw-r--r-- 1 root root 1021 Dec  1 11:03 Callback_test_execute.java
-rw-r--r-- 1 root root 2450 Dec  1 11:03 _testDelD.java
-rw-r--r-- 1 root root  693 Dec  1 11:03 _testDel.java
-rw-r--r-- 1 root root 2069 Dec  1 11:03 _testDelM.java
-rw-r--r-- 1 root root 4311 Dec  1 11:03 _testDisp.java
-rw-r--r-- 1 root root 1011 Dec  1 11:03 testHolder.java
-rw-r--r-- 1 root root  617 Dec  1 11:03 test.java
-rw-r--r-- 1 root root  621 Dec  1 11:03 _testOperations.java
-rw-r--r-- 1 root root  602 Dec  1 11:03 _testOperationsNC.java
-rw-r--r-- 1 root root 8187 Dec  1 11:03 testPrxHelper.java
-rw-r--r-- 1 root root  707 Dec  1 11:03 testPrxHolder.java
-rw-r--r-- 1 root root 1365 Dec  1 11:03 testPrx.java
到目前为止,demo.ice所以Ice接口部分的定义以及相关依赖都已经自动生成.

我们要实现自己的execute方法,覆盖testPrx.java的同名方法:
Java代码 复制代码  收藏代码
  1. //TestImp.java   
  2. package Demo;   
  3.   
  4. import Ice.Current;   
  5.   
  6.   
  7. public class TestImp extends _testDisp{   
  8.   
  9.     public String execute(String mth, String cmd, Current __current) {   
  10.         // TODO Auto-generated method stub   
  11.         return mth+cmd;   
  12.     }   
  13.   
  14.   
  15.   
  16. }  
//TestImp.java
package Demo;

import Ice.Current;


public class TestImp extends _testDisp{

	public String execute(String mth, String cmd, Current __current) {
		// TODO Auto-generated method stub
		return mth+cmd;
	}



}
看到了,就是这么简单,仅仅覆盖_testDisp里面的抽象方法,实现把我们自己的实现代码填充到里面就行了.
之后,我们建立一个Server服务在10000端口进行侦听。
Java代码 复制代码  收藏代码
  1. //Server.java   
  2. package Demo;   
  3.   
  4. public class Server {   
  5.     public static void main(String[] args) {   
  6.         int status = ;   
  7.         Ice.Communicator ic = null;   
  8.         try {   
  9.             ic = Ice.Util.initialize(args);   
  10.             Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(   
  11.                     "TestAdapter""default -p 10000");   
  12.             Ice.Object object = new TestImp();   
  13.             adapter.add(object, ic.stringToIdentity("TestAdapter"));   
  14.             adapter.activate();   
  15.             ic.waitForShutdown();   
  16.         } catch (Ice.LocalException e) {   
  17.             e.printStackTrace();   
  18.             status = 1;   
  19.         } catch (Exception e) {   
  20.             System.err.println(e.getMessage());   
  21.             status = 1;   
  22.         }   
  23.         if (ic != null) {   
  24.             // Clean up   
  25.             //   
  26.             try {   
  27.                 ic.destroy();   
  28.             } catch (Exception e) {   
  29.                 System.err.println(e.getMessage());   
  30.                 status = 1;   
  31.             }   
  32.         }   
  33.         System.exit(status);   
  34.     }   
  35. }  
//Server.java
package Demo;

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(
					"TestAdapter", "default -p 10000");
			Ice.Object object = new TestImp();
			adapter.add(object, ic.stringToIdentity("TestAdapter"));
			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);
	}
}

貌似很复杂,其实里面的很多内容都是固定格式,有些部分需要固定和约定。其中上述红色部分是修改部分。

到目前为止,我们已经完成了大部分工作,我们还需要建一个客户端来对服务端的方法进行调用。
Java代码 复制代码  收藏代码
  1. package Demo;   
  2.   
  3. public class Client {   
  4.     public static void main(String[] args) {   
  5.         int status = ;   
  6.         Ice.Communicator ic = null;   
  7.         try {   
  8.             ic = Ice.Util.initialize(args);   
  9. //          Ice.ObjectPrx base = ic   
  10. //                  .stringToProxy("SimplePrinter:tcp -h 172.17.12.101 -p 10000");   
  11.             Ice.ObjectPrx base = ic   
  12.             .stringToProxy("TestAdapter:default -p 10000");   
  13.   
  14.             testPrx test = testPrxHelper.checkedCast(base);   
  15.             if (test == null)   
  16.                 throw new Error("Invalid proxy");   
  17.             System.out.println(test.execute("My first Ice ""demo"));   
  18.             //System.out.println("ok");   
  19.         } catch (Ice.LocalException e) {   
  20.             e.printStackTrace();   
  21.             status = 1;   
  22.         } catch (Exception e) {   
  23.             System.err.println(e.getMessage());   
  24.             status = 1;   
  25.         }   
  26.         if (ic != null) {   
  27.             // Clean up   
  28.             //   
  29.             try {   
  30.                 ic.destroy();   
  31.             } catch (Exception e) {   
  32.                 System.err.println(e.getMessage());   
  33.                 status = 1;   
  34.             }   
  35.         }   
  36.         System.exit(status);   
  37.     }   
  38. }  
package Demo;

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:tcp -h 172.17.12.101 -p 10000");
			Ice.ObjectPrx base = ic
			.stringToProxy("TestAdapter:default -p 10000");

			testPrx test = testPrxHelper.checkedCast(base);
			if (test == null)
				throw new Error("Invalid proxy");
			System.out.println(test.execute("My first Ice ", "demo"));
			//System.out.println("ok");
		} 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);
	}
}


也貌似很复杂吧,其实不然,也很简单,同样包含很多固定格式。其中

Java代码 复制代码  收藏代码
  1. System.out.println(test.execute("my first Ice ""demo"));  
System.out.println(test.execute("my first Ice ", "demo"));



是我们自己调用的逻辑。

赫赫,大功告成了,现在我们开始运行Server,再运行Client看到了么?
"My first Ice demo"

得到这样的结果,基本Ice之旅的Java部分简单实例我们基本完成。

Ice的性能和稳定性远超于我们的想象,skype知道么?其部分通讯架构就是采用的Ice.

注意:

1》在linux环境下,一定要配置CLASSPTH变量,把 /usr/share/java/Ice.jar 一定要加入进去,否则编译时就会报错,找不到Ice相关的类,加入后一定要使其神效,使用source或者是. ;

2》运行时,在Demo目录级别运行,eg:java Demo/Server、java Demo/Client


 

本文转载自:http://www.iteye.com/topic/182975

李长春
粉丝 81
博文 249
码字总数 117406
作品 0
海淀
私信 提问
ice(Internet Communications Engine) window 安装与配置

什么是ice ice是一个面向对像的中间件平台,因此,这意味着ice提供了一个工具,一些api和一些类库用来构造面向对像蝗基于client-server 的应用程序,因此,ICE适用于在异构环境中使用,他的c...

李长春
2011/12/01
1K
0
Zeroc ICE 之zeroc Registry(Java)

zeroc文档很少,都是我采用“穷举法“踩坑,一个一个摸索。 1.首先在windows中安装zeroc ice,在eclipse中安装Ice Builder插件 2.新建一个java项目(如上图),然后用Ice Builder插件构建生成...

1527
2018/05/29
36
0
OSC 第 81 期高手问答 —— ZeroC Ice 究竟是何方神圣?

OSCHINA 本期高手问答(7月6日-7月12日) 我们请来了 @mycat (吴治辉)为大家解答关于 ZeroC Ice 方面的问题。 吴治辉,@mycat, 拥有超过 15 年的软件研发经验,精通 Java 编程,专注于电信软...

叶秀兰
2015/07/06
31.8K
59
Zeroc Ice grid 研究学习

一、概念 slice: ice提供了自己的接口定义语言。用来定义rpc的接口和对象。 ice.object: rpc调用的接口必须继承自ice.Object servant:ice.Object的实例化对象叫做servant,rpc调用的就是ser...

purely
2015/07/08
3.7K
0
Zeroc Ice返回值类型对象的实现(转帖)

引言: 最近比较搓,忙得没空写写博客,回想一下又好像没忙什么事。得反省一下了,当然此是后话。 本文就Zeroc Ice方法返回复杂类的对象(return by-value, not by-reff),做以简单说明。之...

李长春
2011/12/06
493
0

没有更多内容

加载失败,请刷新页面

加载更多

技术分享 | MySQL 8.0:字符集从 utf8 转换成 utf8mb4

作者:胡呈清 整理 MySQL 8.0 文档时发现一个变更:默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。...

爱可生
21分钟前
4
0
不管单机还是集群的限流实现已经给你准备好了

限流算法 计数器算法 维护一个counter,规定在单位时间内counter的大小不能超过最大值,每隔固定时间就将counter的值置零。如果这个counter大于设定的阈值,那么系统就拒绝请求 漏桶算法 维护...

阿提说说
32分钟前
4
0
文件管理

通过CLI登录进行文件管理 .表示当前目录,..表示父目录,具有隐藏文件。支持缩写与TAB键补全 1、目录操作 pwd#打印工作目录 cd <directory>#改变工作目录 dir [/all][<directory>]#查看目录内...

悠悠子佩
34分钟前
4
0
Netty学习笔记(10)——Netty中的Channel组件

1. Channel的功能 1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操...

江左煤郎
38分钟前
3
0
二叉树的深度

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 public int TreeDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(Tree...

Garphy
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部