zoukankan      html  css  js  c++  java
  • idea使用java整合ice

    ice是跨平台,跨语言服务端调用的解决方案

    一.下载ice3.6

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

    二.配置环境变量

    ICE_HOME= D:projecteroCIce-3.6.4

    Path= %ICE_HOME%in;

    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 ..srcmainjava

    执行成功之后会在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
  • 相关阅读:
    最小生成树
    单源最短路
    插入排序 静态链表转为有序数组
    不定时更新
    huffman
    二叉树
    宽度优先搜索
    深度优先搜索
    链表
    jQuery学习中 attr() 和 prop() 的区别
  • 原文地址:https://www.cnblogs.com/chong-zuo3322/p/12802472.html
Copyright © 2011-2022 走看看