關於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的文件:
- module Demo{
- interface test{
- string execute(string mth,string cmd);
- };
- };
注意: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的同名方法:
- //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;
- }
- }
- //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端口進行偵聽。
- //Server.java
- package Demo;
- public class Server {
- public static void main(String[] args) {
- int status = ;
- 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);
- }
- }
- //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);
- }
- }
貌似很複雜,其實裏面的很多內容都是固定格式,有些部分需要固定和約定。其中上述紅色部分是修改部分。
到目前爲止,我們已經完成了大部分工作,我們還需要建一個客戶端來對服務端的方法進行調用。
- package Demo;
- public class Client {
- public static void main(String[] args) {
- int status = ;
- 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);
- }
- }
- 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);
- }
- }
也貌似很複雜吧,其實不然,也很簡單,同樣包含很多固定格式。其中
- 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.