首页 > 代码库 > Ice的HelloWorld(Java)

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分布式程序设计》)