Ice的HelloWorld(Java)


Ice是一種面向對象的中間間平台,入門ice,簡單的HelloWorld是必不可少的。

轉載請注明http://www.cnblogs.com/zrtqsk/p/3745286.html,謝謝。

一、寫一個ice定義

  ice用來定義接口、程序骨架的,方便遠程調用。首先我們要使用ice專屬的slice語言寫一個ice定義。如下:

file_name:HelloWorld.ice

module myHelloWorld{
    interface HelloWorld{
        void say(string s);
    };
};

module相當於java中的包,是ice定義中必不可少的。

 

二、編譯這個ice定義  

  要編譯這個ice定義,首先要安裝一個ice服務器,將其中的bin文件夾加入環境變量。跟jdk配置類似。然后使用其中的slice2java命令編譯。

  例如HelloWorld.ice文件放在我F盤的test文件夾,運行,就可以在test目錄出現如下文件:

  

  myHelloWorld文件夾名是ice定義中的module名。

 

三、編寫Servant類

  servant類是ice服務器端提供操作調用的行為制品,它提供的是ice對象的實質內容。說白了,就是ice所定義的接口,在服務器端的實現類。

  按照管理,servant類名是ice接口名加一個“I”后綴,如下:

  

package client;

import Ice.Current;
import myHelloWorld._HelloWorldDisp;

public class HelloWorldI extends _HelloWorldDisp{

    private static final long serialVersionUID = 1L;

    @Override
    public void say(String s, Current __current) {
        System.out.println("Hello World!"+" the string s is " + s);
    }
}

如上,servant類需要繼承_HelloWorldDisp這個slice2java編譯生成的抽象類。實現方法參數是原本的形參加一個Ice的Current對象。

 

四、編寫遠程的服務器類

package client;
public class Server {

    public static void main(String[] args)
    {
        int status = 0;
        // Communicator實例,是ice run time的主句柄
        Ice.Communicator ic = null;
        try
        {
            // 調用Ice.Util.Initialize()初始化Ice run time
            System.out.println("初始化ice run time...");
            ic = Ice.Util.initialize(args);
            
            
            // 創建一個對象適配器,傳入適配器名字和在10000端口處接收來的請求
            System.out.println("創建對象適配器,監聽端口10000...");
            Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
            
            // 實例化一個PrinterI對象,為Printer接口創建一個servant
            System.out.println("為接口創建servant...");
            Ice.Object object = new HelloWorldI();

            // 調用適配器的add,告訴它有一個新的servant,傳遞的參數是剛才的servant,這里的“SimplePrinter”是Servant的名字
            System.out.println("對象適配器加入servant...");
            adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));
            
            //調用適配器的activate()方法,激活適配器。被激活后,服務器開始處理來自客戶的請求。
            System.out.println("激活適配器,服務器等待處理請求...");
            adapter.activate();
            
            //這個方法掛起發出調用的線程,直到服務器實現終止為止。或我們自己發出一個調用關閉。
            ic.waitForShutdown();
        } catch (Ice.LocalException e)
        {
            e.printStackTrace();
            status = 1;
        } catch (Exception e)
        {
            e.printStackTrace();
            status = 1;
        } finally
        {
            if (ic != null)
            {
                ic.destroy();
            }
        }
        System.exit(status);
    }
}

這個服務器類其實就寥寥幾行代碼,注釋已經很清楚了。

 

五、編寫客戶端類

package client;
import myHelloWorld.HelloWorldPrx;
import myHelloWorld.HelloWorldPrxHelper;

public class Client {

    public static void main(String[] args)
    {
        int status = 0;
        // Communicator實例
        Ice.Communicator ic = null;
        try
        {
            // 調用Ice.Util.Initialize()初始化Ice run time
            ic = Ice.Util.initialize(args);

            // 獲取遠地打印機的代理
            Ice.ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000");

            // 將上面的代理向下轉換成一個Printer接口的代理
            HelloWorldPrx helloWorld = HelloWorldPrxHelper.checkedCast(base);

            // 如果轉換成功
            if (helloWorld == null)
            {
                throw new Error("Invalid proxy");
            }

            // 調用這個代理,將字符串傳給它
            helloWorld.say("bar");

        } catch (Ice.LocalException e)
        {
            e.printStackTrace();
            status = 1;
        } catch (Exception e)
        {
            e.printStackTrace();
            status = 1;
        } finally
        {
            if (ic != null)
            {
                ic.destroy();
            }
        }
        System.exit(status);
    }
}

 

六、運行

  先運行服務器,服務器線程一直運行等待,如下:  

初始化ice run time...
創建對象適配器,監聽端口10000...
為接口創建servant...
對象適配器加入servant...
激活適配器,服務器等待處理請求...

  運行了客戶端后,顯示如下:

初始化ice run time...
創建對象適配器,監聽端口10000...
為接口創建servant...
對象適配器加入servant...
激活適配器,服務器等待處理請求...
Hello World! the string s is bar

  將客戶端改一下 helloWorld.say("foo");,再運行,顯示如下:

初始化ice run time...
創建對象適配器,監聽端口10000...
為接口創建servant...
對象適配器加入servant...
激活適配器,服務器等待處理請求...
Hello World! the string s is bar
Hello World! the string s is foo

 

(部分參考《Ice分布式程序設計》)

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM