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); }
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); }