ICE 安裝方法

關於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開發人員注意)

  1. module Demo{
  2. interface test{
  3. string execute(string mth,string cmd);
  4. };
  5. };



注意,後兩個"}"一定要包含";",否則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. }
  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. }

看到了,就是這麼簡單,僅僅覆蓋_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. }
  1. //Server.java
  2. package Demo;
  3.  
  4. public class Server {
  5. public static void main(String[] args) {
  6. int status = 0;
  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. }


貌似很複雜,其實裏面的很多內容都是固定格式,有些部分需要固定和約定。其中上述紅色部分是修改部分。

到目前爲止,我們已經完成了大部分工作,我們還需要建一個客戶端來對服務端的方法進行調用。

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. }
  1. package Demo;
  2.  
  3. public class Client {
  4. public static void main(String[] args) {
  5. int status = 0;
  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. }



也貌似很複雜吧,其實不然,也很簡單,同樣包含很多固定格式。其中

Java代碼
  1. System.out.println(test.execute("my first Ice ", "demo"));
  1. System.out.println(test.execute("my first Ice ", "demo"));



是我們自己調用的邏輯。

赫赫,大功告成了,現在我們開始運行Server,再運行Client看到了麼?
"My first Ice demo"

得到這樣的結果,基本Ice之旅的Java部分簡單實例我們基本完成。

Ice的性能和穩定性遠超於我們的想象,skype知道麼?其部分通訊架構就是採用的Ice.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章