ZEROC ICE 跨平台间程序调用 java版 - 嗨!蜗牛

标签: zeroc ice 跨平台 | 发表时间:2015-03-24 10:56 | 作者:嗨!蜗牛
出处:

前言:

  本来建博客是为了和大家分享一些前端的开发经验和心得呢,但是阴差阳错,第一篇技术博客确实关于跨平台,跨语言服务端调用的解决方案---ZEROC ICE。

     最近一个项目涉及到java、python、C++三种不同语言间的互相调用。经过反复讨论决定采取ZEROC来实现,在实现的过程中发现网上的很多资料要么很不完整,要么就是过于基础,完全不能满足项目的需要。尤其是对于如何使用ice进行分布式编程介绍更少,除了C++语言外,其他语言的ice使用说明也存在明显不足,虽然不同语言原理一样,但是对于初学者而言,要求还是比较高。所以特地在这里对我们的ice实施解决方案做一个回顾与总结,同时也抛砖引玉,如果有高手发现我们的方案不好,让我也有个二次深入学习的机会!

 

正文:

  本博客系列主要讲解  java语言的ice 客户端、服务端调用、amd服务端异步、客户端调用等。从hello world开始讲解!

   一、写一个helloworld的ice文件HelloWorld.ice

1 module myHelloWorld{
2 interface HelloWorld{
3 void say(string s);
4 };
5 };

  module相当于java中的包名;interface对应java中的接口;say对应方法

   二、编译这个ice定义

  安装一个ice服务器,注意如果大家是不同语言合作开发,那么不同人安装的ice版本最好保持一致,安装linux版本时,注意各种rpm之间的依赖关系。(这里默认大家都会安装,如果不会就去百度去吧,官网上有详尽的说明:https://zeroc.com/)

  通过slice2java HelloWorld.ice   来编译ice为java包文件。编译好之后请将改文件夹直接拷贝到工程的src目录下,因为生成的java文件会有对应的包名。为了不报错,必须实际路径和包名一致。同时,到ice的安装目录下,打来lib文件夹,将其中的jar包引入到工程中,确保相关文件没有报错即可。

    三、 编写Servant类

  servant类是ice所定义的接口,在服务器端的实现类。我们在该类中可以编写服务器端对请求的具体处理。

  按照管理,servant类名是ice接口名加一个“I”后缀,如下:

1 package client;
2
3 import Ice.Current;
4 import myHelloWorld._HelloWorldDisp;
5
6 public class HelloWorldI extends _HelloWorldDisp{
7
8 private static final long serialVersionUID = 1L;
9
10 @Override
11 public void say(String s, Current __current) {
12 System.out.println("Hello World!"+" the string s is " + s);
13 }
14 }

   四、创建远程的服务器类

  初学者建议仔细看看下边的server服务类,该服务类绝大多数代码都是固定格式,只需要根据自己的实际情况变更一下端口、servant的名称、需要加入服务器的servant类即可。

1 package client;
2 public class Server {
3
4 public static void main(String[] args)
5 {
6 int status = 0;
7 // Communicator实例,是ice run time的主句柄
8 Ice.Communicator ic = null;
9 try
10 {
11 // 调用Ice.Util.Initialize()初始化Ice run time
12 System.out.println("初始化ice run time...");
13 ic = Ice.Util.initialize(args); //args参数可传可不传
14
15
16 // 创建一个对象适配器,传入适配器名字和在10000端口处接收来的请求
17 System.out.println("创建对象适配器,监听端口10000...");
18 Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
19
20 // 实例化一个PrinterI对象,为Printer接口创建一个servant
21 System.out.println("为接口创建servant...");
22 Ice.Object object = new HelloWorldI();
23
24 // 调用适配器的add,告诉它有一个新的servant,传递的参数是刚才的servant,这里的“SimplePrinter”是Servant的名字
25 System.out.println("对象适配器加入servant...");
26 adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));
27
28 //调用适配器的activate()方法,激活适配器。被激活后,服务器开始处理来自客户的请求。
29 System.out.println("激活适配器,服务器等待处理请求...");
30 adapter.activate();
31
32 //这个方法挂起发出调用的线程,直到服务器实现终止为止。或我们自己发出一个调用关闭。
33 ic.waitForShutdown();
34 } catch (Ice.LocalException e)
35 {
36 e.printStackTrace();
37 status = 1;
38 } catch (Exception e)
39 {
40 e.printStackTrace();
41 status = 1;
42 } finally
43 {
44 if (ic != null)
45 {
46 ic.destroy();
47 }
48 }
49 System.exit(status);
50 }
51 }

   五、编写客户端类

  与服务端一样,客户端的格式也是基本不变的。

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

// 根据servant的名称以及服务器ip、端口获取远程服务代理
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

   七、小结

  以上的代码是同一台电脑之间调用,如果需要跨服务器之间调用,或者无论其他什么语言的客户端调用,只需要获取远程服务代理的时候加上ip即可。default默认采取tcp协议,所以下边的代码其实等同于上边我们调用本地机器的代码。

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

 

  上边是最简单的ice调用,它的优势是:在我们编写服务端客户端的时候,不需要考虑调用方是什么语言编写的,只需要按照我们当前使用语言的书写习惯去完成我们自己一端的代码即可,并且服务器客户端之间可以通过结构体(对象)的方式进行直接调用,更符合我们的日常变成习惯。

   下一节我会把如何ice amd调用的原理以及如何通过java语言编写ice服务端、客户端的代码分享出来,后边可能还会有如何通过ice建立长连接,实现服务器客户端的互相调用。


本文链接: ZEROC ICE 跨平台间程序调用 java版,转载请注明。

相关 [zeroc ice 跨平台] 推荐:

ZEROC ICE 跨平台间程序调用 java版 - 嗨!蜗牛

- - 博客园_首页
  本来建博客是为了和大家分享一些前端的开发经验和心得呢,但是阴差阳错,第一篇技术博客确实关于跨平台,跨语言服务端调用的解决方案---ZEROC ICE.      最近一个项目涉及到java、python、C++三种不同语言间的互相调用. 经过反复讨论决定采取ZEROC来实现,在实现的过程中发现网上的很多资料要么很不完整,要么就是过于基础,完全不能满足项目的需要.

ZEROC Ice 初步认识

- - 企业架构 - ITeye博客
ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够以最小的代价构建分布式应用程序. ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等.

北极熊冰格:Polar Ice

- Zhen - 爱…稀奇~{新鲜:科技:创意:有趣}
爱稀奇引进过泰国Qualy的北极熊冰桶(Polar Ice Bucket),现在,我们来看看日本设计师Atsuhiro Hayashi的类似创意,北极熊冰格(Polar Ice):. 简单地说,这冰格像个圆筒,能制作出一只孤独的北极熊站在一大块浮冰上这种造型的冰块,将之加到饮料中,熊熊在浮力的作用下会高出水面,但是终究会因为冰块的融化而沉没…….

视频:Nexus Prime + Ice Cream Sandwich

- 骏骏 - 36氪
今天韩国网站Gadget.io拿到了一份泄露版的运行最新版的Ice Cream Sandwich系统的三星Nexus Prime手机视频. Nexus Prime是三星在10月11号即将发布的新手机,Ice Cream Sandwich是Google的下一代Android操作系统代号,这二个产品有望在11号那天一起发布.

ICE应用实例(01):

- - 企业架构 - ITeye博客
本文接上篇博文《ICE通信框架》如果你还没有接触过ice请先阅读我的上篇博文 http://blog.csdn.net/liuzhoulong/archive/2011/03/04/6223450.aspx. 本文将结合实际项目,做一个基于 ice的实际项目实例应用,该实例完成客户端调用服务端接口完成消息发送,计算的功能.

Android 4.0 Ice Cream Sandwich 截图曝出

- Vendetta - 爱范儿 · Beats of Bits
Ice Cream Sandwich 将是 Android 系统的一次重大升级,对此我们也非常期待,但是对于 ICS 的情况,Google 很少透露. RootzWiki 网站宣布从一个可靠的信息源得到 Android 4.0 的图片和信息. 根据该网站的说法,Ice Cream Sandwich 的开发仍处于“非常早期的阶段,功能并非 100% 可用.

Android Ice Cream Sandwich 截图首次泄露

- 请叫我火矞弟 - Engadget 中国版
继续阅读全文 Android Ice Cream Sandwich 截图首次泄露. 引用来源 | 引用来源 | 引用来源 | 此文章网址 | 转寄此文章 | 回应.

Android Ice Cream Sandwich 首张截图泄露

- Raining - cnBeta.COM
Android Ice Cream Sandwich 首张截图已经华丽地泄露出来,内部版本号是IRK36B,该版本运行在一台Nexus S上,用户界面出现了非常大的变化,图表配色转向蓝色,全新的launcher和应用程序抽屉,带来了新的GMail程序和相机的全景模式.

谷歌Android Ice Cream Sandwich发布在即

- Adam - cnBeta.COM
据国外媒体报道,谷歌目前正积极协助开发者为即将发布的Android 冰淇淋三明治(ICS)做准备,该款系统可谓一款标准手机操作系统,可用于智能手机和平板电脑. 公司已经明确表示,将发布一款能方便开发者将现有蜂窝(Honeycomb)系统下的应用程序用于智能手机的SDK,并不会做太多改动. 同时开发者还可以在使用蜂窝系统的平板电脑的动作条上构建该款SDK.

Android 4.0 Ice Cream Sandwich 五大特色

- daviddu - Crave 科技瘋
Google日前與Samsung共同發表最新的Android 4.0作業系統,又名Ice Cream Sandwich (ICS). Samsung最近推出的Galaxy Nexus是首部搭載ICS作業系統的手機.