少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          1       ICE簡介

          1.1    簡介

          ICE(Internet Communications Engine)是一個中間件平臺。作為一個高性能的互聯(lián)網(wǎng)通信平臺,ICE包含了很多分層的服務(wù)和插件(Plug-ins),并且簡單、高效和強大。

          ICE當前支持C++JavaC#Visual BasicPythonPHP編程語言,并支持在多種操作系統(tǒng)上運行。更多的操作系統(tǒng)和編程語言將會在以后的發(fā)布中支持。  

          1.2    組成部分

          ICE有以下幾部分組成:

           

          1.2.1   Slice

          Slice(Specification Language for Ice) ICE的規(guī)范語言,跟CORBAIDL(Interface Definition Language)等價的東西,一種用于使對象接口與其實現(xiàn)相分離的基礎(chǔ)性抽象機制。Slice建立了客戶端和服務(wù)器端共同遵守的契約:接口。Slice也用來描述對象持久數(shù)據(jù)。

          Slice描述獨立于實現(xiàn)語言,所以客戶實現(xiàn)語言是否與編寫服務(wù)器所用的語言相同沒有任何關(guān)系。slice語言片段可以被編譯為任何所支持語言的實現(xiàn)。目前Ice Slice可以支持映射到到C++, Java, C#, Python,Ruby, and PHP。因為Slice主要對接口和類型的定義和描述,沒有實現(xiàn)部分。  

           

          1.2.2   Slice Compilers

          Slice的規(guī)范語言可以影射成多種編程語言。目前ICE支持C++JavaPythonPHPC#VB的語言影射。Ice的客戶端和服務(wù)器端協(xié)同工作,而不會知道分別實現(xiàn)的是何種編程語言。

           

          1.2.3   Ice

          Ice的核心庫。在眾多的特性當中,Ice核心庫通過一個高效的協(xié)議(包含TCP/UDP層上協(xié)議壓縮)來管理所有的通信任務(wù),為多線程服務(wù)器提供了一個靈活的線程池,并且有特別的功能來支持上百萬對象的可擴展性。

           

          1.2.4   IceUtil

          一些常用的功能函數(shù)集。例如Unicode處理和多線程編程,是用C++寫成。

           

          1.2.5   IceBox

          一個專用于ICE應(yīng)用的應(yīng)用服務(wù)器。ICEBox可以方便地運行和管理動態(tài)加載、共享庫或java類的形式Ice的服務(wù)。

           

          1.2.6   IcePack

          一個成熟的服務(wù)激活和部署工具。IcePack能大大簡化在異構(gòu)網(wǎng)絡(luò)之間部署應(yīng)用的復雜性。只要簡單的編寫XML格式的一個部署描述文件,IcePack就能自動處理剩下的工作。

           

          1.2.7   Freeze

          Freeze提供了Ice Servants對象的自動持久性。通過幾行代碼,一個應(yīng)用就可以生成一個高度可擴展的逐出器(evictor)來高效地管理持久對象。

           

          1.2.8   FreezeScript

          在大的軟件項目里,持久對象的數(shù)據(jù)類型改變很常見。為了最小化這些變化的影響,FreezeScript提供了相應(yīng)的工具來檢查和移植Freeze生成的數(shù)據(jù)庫。這些工具支持XML格式的配置腳本,易于使用。

           

          1.2.9   IceSSL

          用于Ice核心的動態(tài)的SSL傳輸插件。提供了認證、加密和消息完整性,使用工業(yè)標準的SSL協(xié)議來實現(xiàn)。

           

          1.2.10 Glacier

          面向?qū)ο笾虚g件平臺的一個最大的挑戰(zhàn)是安全性和防火墻。GlacierIce的防火墻解決方案,它大大簡化了安全程序的部署。

          Glacier認證和過濾客戶的請求并允許服務(wù)器通過安全的方式回調(diào)客戶端對象。結(jié)合IceSSL的使用,Glacier提供了強大的安全解決方案,即安全,又易于配置管理。

           

          1.2.11 IceStorm

          一個支持聯(lián)盟的消息服務(wù)。和大多數(shù)的其他消息和事件服務(wù)相比,IceStorm支持有類型的事件,這意味著通過聯(lián)盟廣播一個消息和調(diào)用一個接口上的一個方法一樣容易。

           

          1.2.12 IcePatch

          一個軟件修補和分發(fā)的服務(wù)。為確保運行的軟件是最新的版本,要經(jīng)常更新軟件,這是一件乏味的工作。IcePatch自動更新在某個目錄層次下的文件。只有需要更新的文件會下作到客戶端,為了快速的下載更新,IcePatch使用的高效的壓縮算法。

           

          2        多語言分布式互聯(lián)

          Ice的服務(wù)端可以采用C++/Java/Python/C#等實現(xiàn),客戶端可以采用C++/Java/Python/C#/VB/PHP/Ruby來實現(xiàn)。這個特性是Ice的很重要的優(yōu)勢之一。

          2.1    概述

          2.1.1   相同的開發(fā)環(huán)境

           

          2.1.2   不同開發(fā)環(huán)境

           

          2.2    接口

          建立一個Printer.ice文件

          module Demo {

              interface Printer {

                  void printString(string s);

              };

          };

           

          2.3    Java /Java

          服務(wù)端采用java實現(xiàn),客戶端可以采用java實現(xiàn)。

          2.3.1   實現(xiàn)接口

          dos環(huán)境下執(zhí)行 slice2java Printer.ice 命令

          會在當前目錄產(chǎn)生一個Demo目錄,目錄里自動生成如下文件:

          _PrinterDel.java

          _PrinterDelD.java

          _PrinterDelM.java

          _PrinterDisp.java

          _PrinterOperations.java

          _PrinterOperationsNC.java

          Printer.java

          PrinterHolder.java

          PrinterPrx.java

          PrinterPrxHelper.java

          PrinterPrxHolder.java

           

          PrinterI.java

          package slice2java;

           

          import Ice.Current;

          import Demo._PrinterDisp;

           

          /**

           * _PrinterDisp 基類由slice2java編譯器生成,它是一個抽象類。

           * _PrinterDisp 抽象類包含一個printString()方法。

           */

          public class PrinterI extends _PrinterDisp{

              public void printString(String s, Current current)

              {

                  System.out.println(s + " ice !");

              }

          }

           

          2.3.2   Server

          Server.java

           

          package server;

           

          import slice2java.PrinterI;

          import Ice.Util;

          import Ice.ObjectAdapter;

          import Ice.Object;

          import Ice.Communicator;

           

          public class Server {

              public static void main(String[] args) {

                 int status = 0;

                 // 創(chuàng)建一個通信器的對象ic

                 Communicator ic = null;

                 try {

                     // 初始化Ice運行時

                     ic = Util.initialize();

                     /*

                       * 創(chuàng)建一個對象適配器(ObjectAdapter)對象adapter,并初始化之。

                       * 參數(shù)"SimplePrinterAdapter":表示適配器的名字。

                       * 參數(shù)"default -p 10000":表示適配器使用缺省協(xié)議(TCP/IP)在端口10000處監(jiān)聽到來的請求。

                       */

                     ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(

                            "SimplePrinterAdapter""default -p 10000");

                     Object object = new PrinterI();

                      // object添加到適配器,并命名為"SimplePrinter"

                     adapter.add(object, ic.stringToIdentity("SimplePrinter"));

                     // 激活適配器,以使服務(wù)器開始處理來自客戶的請求

                     adapter.activate();

                     /*

                       * 掛起發(fā)出調(diào)用的線程,直到服務(wù)器實現(xiàn)終止為止.

                       * 或者是通過發(fā)出一個調(diào)用關(guān)閉運行時(run time)的指令來使服務(wù)器終止.

                       */

                     ic.waitForShutdown();

                 } catch (Ice.LocalException e) {

                     e.printStackTrace();

                     status = 1;

                 } catch (Exception e) {

                     System.out.println(e.getMessage());

                     status = 1;

                 }

                 if (ic != null) {

                     // Clean up

                     //

                     try {

                        // 銷毀通信連接

                        ic.destroy();

                     } catch (Exception e) {

                        System.out.println(e.getMessage());

                        status = 1;

                     }

                 }

                 System.exit(status);

              }

          }

           

          2.3.3   Client

          Client.java

           

          package client;

           

          import Ice.Util ;

          import Demo.PrinterPrxHelper ;

          import Ice.ObjectPrx ;

          import Demo.PrinterPrx ;

          import Ice.Communicator ;

           

          public class Client {

              public static void main(String[] args) {

                 int status = 0;

                 Communicator ic = null;

                 try {

                     ic = Util.initialize();

                     /*

                       * 獲取遠程對象的代理

                       * 創(chuàng)建一個代理對象,并用通信器的stringToProxy()方法初始化之.

                       */

                     ObjectPrx base = ic

                            .stringToProxy("SimplePrinter:default -p 10000");

                     PrinterPrx printer = PrinterPrxHelper.checkedCast(base);

                     if (printer == null)

                        throw new Error("Invalid ice");

                     printer.printString("Hello ");

                 } catch (Ice.LocalException e) {

                     e.printStackTrace();

                     status = 1;

                 } catch (Exception e) {

                     System.out.println(e.getMessage());

                     status = 1;

                 }

                 if (ic != null) {

                     // Clean up

                     //

                     try {

                        ic.destroy();

                     } catch (Exception e) {

                        System.out.println(e.getMessage());

                        status = 1;

                     }

                 }

                 System.exit(status);

              }

          }

           

          2.4    C++/ C++

          服務(wù)端采用C++實現(xiàn),客戶端可以采用C++實現(xiàn)。

          2.4.1   實現(xiàn)接口

          dos環(huán)境下執(zhí)行 slice2cpp Printer.ice 命令

          會在當前目錄下產(chǎn)生兩個文件,自動生成的文件如下:

          Printer.h

          Printer.cpp

           

          2.4.2   Server

           

          2.4.3   Client

           

          2.5    C++/Java

          服務(wù)端采用C++實現(xiàn),客戶端可以采用java實現(xiàn)。

          我們已Java,C++作為Ice例子原形,我們只需要運行C++服務(wù)端程序,在運行Java客戶端程序就可以實現(xiàn)JavaC++互聯(lián)互通。

          目前沒有我們所有實例都是基于同一臺機器的,實際情況服務(wù)端和客戶端會分布在不同機器上。這種情況下,我們需要如下修改:

          "default -p 10000" 采用 "tcp -h server1 -p port" 替代

          服務(wù)端所在主機IP: 10.0.68.18 ,端口:10080

          所以就修改為:tcp -h 10.0.68.18 -p 10080,再重新編譯就可以了

          客戶端也同樣修改就可以了

          如果要監(jiān)聽多個端口,我么可以如下修改:

          服務(wù)端: tcp -h host -p port1:tcp -h host -p port2形式

          例:

          服務(wù)端 

          tcp -h 10.0.68.18 -p 10080: tcp -h 10.0.68.18 -p 10081

          客戶端:可以監(jiān)聽兩個,也可以監(jiān)聽一個

          posted on 2011-12-15 20:35 abin 閱讀(4799) 評論(1)  編輯  收藏

          Feedback

          # re: ICE簡介 2015-10-20 10:57 阿夫頓
          色鬼  回復  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 绍兴县| 崇州市| 邓州市| 丰顺县| 通江县| 文登市| 肇源县| 田东县| 盐池县| 焦作市| 蕉岭县| 荔浦县| 贡觉县| 邛崃市| 平江县| 余干县| 肥东县| 昆山市| 诸暨市| 全南县| 启东市| 读书| 昌黎县| 曲松县| 南澳县| 文成县| 维西| 西峡县| 融水| 綦江县| 肇东市| 陇川县| 郯城县| 安顺市| 沛县| 清镇市| 娱乐| 盘山县| 攀枝花市| 长武县| 卢龙县|