最新稳定版本:
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.jardb-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代码
module Demo{
interfacetest{
string execute(string mth,string cmd);
};
};
注意:string确实是小写(java开发人员注意)
module Demo{
interfacetest{
string execute(string mth,string cmd);
};
};
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代码
//TestImp.java
packageDemo;
importIce.Current;
publicclassTestImpextends_testDisp{
publicString execute(String mth, String cmd, Current __current) {
// TODO Auto-generated method stub
returnmth+cmd;
}
}
//TestImp.java
packageDemo;
importIce.Current;
publicclassTestImpextends_testDisp{
publicString execute(String mth, String cmd, Current __current) {
// TODO Auto-generated method stub
returnmth+cmd;
}
}
//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代码
//Server.java
packageDemo;
publicclassServer {
publicstaticvoidmain(String[] args) {
intstatus =;
Ice.Communicator ic =null;
try{
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"TestAdapter","default -p 10000");
Ice.Object object =newTestImp();
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);
}
}
//Server.java
packageDemo;
publicclassServer {
publicstaticvoidmain(String[] args) {
intstatus =0;
Ice.Communicator ic = null;
try{
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"TestAdapter","default -p 10000");
Ice.Object object = newTestImp();
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);
}
}
//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代码
packageDemo;
publicclassClient {
publicstaticvoidmain(String[] args) {
intstatus =;
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)
thrownewError("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);
}
}
packageDemo;
publicclassClient {
publicstaticvoidmain(String[] args) {
intstatus =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)
thrownewError("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);
}
}
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代码
System.out.println(test.execute("my first Ice ","demo"));
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.