idea使用java整合ice


ice是跨平台,跨語言服務端調用的解決方案

一.下載ice3.6

http://download.zeroc.com/Ice/3.6/Ice-3.6.4.msi

二.配置環境變量

ICE_HOME= D:\project\ZeroC\Ice-3.6.4

Path= %ICE_HOME%\bin;

cmd打開dos窗口查看是否安裝成功: slice2java -v

三.idea創建ice文件

pom.xml

        <dependency>
            <groupId>com.zeroc</groupId>
            <artifactId>ice</artifactId>
            <version>3.6.3</version>
        </dependency>

先創建slice文件夾然后創建包路徑最后創建Hello.ice

 如果不能創建ice文件可以先創建file文件以.ice結尾,idea會提示下載ice插件,然后重啟就行了

Hello.ice:

[["java:package:com.test.ice.service"]] // 定義java包名  父結構
module demo    //模塊包名
{
interface Hello   //接口服務名稱
    {
        string sayHello(string s);   //具體的方法
    };
};

四.使用slice2java編譯ice文件生成java代碼

打開cmd窗口進入Hello.ice目錄下執行:

slice2java .\Hello.ice --output-dir ..\src\main\java

執行成功之后會在java目錄下生成10個java文件

 

五.編寫程序 HelloI  Client  Server

public class HelloI extends _HelloDisp {
    private static final long serialVersionUID = -3966457693815687559L;
    private Logger log = Logger.getLogger(this.getClass().getSimpleName());


    public String sayHello(String s, Current __current) {
        log.info("具體的服務接口實現類中的sayHello方法被調用了。。。");
        return "Hello " + s;
    }
}
public class Client {
    private static Logger log = Logger.getLogger(Client.class.getSimpleName());

    public static void main(String[] args) {
        log.info("客戶端啟動...");
        // 通信器
        Communicator ic = null;
        // 初始化這個通信器
        ic = Util.initialize(args);
        // 根據地址生成一個服務代理對象
        // HelloIce -- 服務端那邊自己定義的名字
        ObjectPrx proxy = ic.stringToProxy("HelloIce:default -p 1888");
        // 轉換成HelloService類型的代理服務
        HelloPrx hello = HelloPrxHelper.checkedCast(proxy);
        //調用方法
        String s = hello.sayHello("World!");
        System.out.println(">>"+s);
    }

}
public class Server {
    private static Logger log = Logger.getLogger(Server.class.getSimpleName());

    public static void main(String[] args) {
        // 通信器
        Communicator ic = null;
        // 初始化這個通信器
        ic = Util.initialize(args);
        // 創建ice適配器,將服務調用地址和服務映射起來
        // "HelloServiceAdapter"是適配器名, "default -p 1888"是服務調用的地址
        ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("HelloServiceAdapter","default -p 1888");
        // 將服務的具體實現類servant交給這個適配器
        Object servant = new HelloI();
        // "HelloIce"--服務接口在ice中注冊名,轉成唯一標識identity
        Identity id = Util.stringToIdentity("HelloIce");
        adapter.add((Ice.Object) servant, id);
        // 激活這個適配器
        adapter.activate();

        log.info("server服務容器啟動成功。。。");
    }
}

六.啟動程序

先啟動server

 

 再啟動client

 以上的代碼是同一台電腦之間調用,如果需要跨服務器之間調用,或者無論其他什么語言的客戶端調用,只需要獲取遠程服務代理的時候加上ip即可。default默認采取tcp協議,所以下邊的代碼其實等同於上邊我們調用本地機器的代碼。

Ice.ObjectPrx base = ic.stringToProxy("HelloIce:tcp -h 127.0.0.1 -p 10000");

一個簡單的java開發ice案例完成 

 

server:

public static void main(String[] args)
    {
        int status = 0;
        // Communicator實例,是ice run time的主句柄
        Communicator ic = null;
        try
        {
            // 調用Ice.Util.Initialize()初始化Ice run time
            System.out.println("初始化ice run time...");
            //args參數可傳可不傳
            ic = Util.initialize(args);


            // 創建一個對象適配器,傳入適配器名字和在10000端口處接收來的請求
            System.out.println("創建對象適配器,監聽端口10000...");
            ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");

            // 實例化一個PrinterI對象,為Printer接口創建一個servant
            System.out.println("為接口創建servant...");
            Object servant = new HelloI();

            // 調用適配器的add,告訴它有一個新的servant,傳遞的參數是剛才的servant,這里的“SimplePrinter”是Servant的名字
            System.out.println("對象適配器加入servant...");
            adapter.add((Ice.Object) servant, 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);
    }
View Code

Client:

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

            //   根據servant的名稱以及服務器ip、端口獲取遠程服務代理
            ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000");

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

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

            // 調用這個代理,將字符串傳給它
            String s = hello.sayHello("World!");
            System.out.println(s+"<<");

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

 


免責聲明!

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



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