初学ICE中间件总结笔记(一)

来源:互联网 发布:淘宝严重违规12分2999 编辑:程序博客网 时间:2024/04/30 18:41

参考文章连接:http://blog.csdn.net/whuqin/article/details/7750107

                     http://blog.csdn.net/nokianasty/article/details/9701863

                     http://yangguo.iteye.com/blog/1096630

ICE介绍

是ZeroC公司开发的一款高效的开源中间件平台,全称是Internet Communications Engine。

它的主要设计目标是:

提供适用于异种环境的面向对象中间件平台。
提供一组完整的特性,支持广泛的领域中的实际的分布式应用的开发。
避免不必要的复杂性,使平台更易于学习和使用。 
提供一种在网络带宽、内存使用和 CPU 开销方面都很高效的实现。
提供一种具有内建安全性的实现,使它适用于不安全的公共网络。

ICE支持多种编程语言:C++、Java、C#、VB、Python、Ruby,也就是说使用ICE时我们可以让这些语言无缝沟通,不过由于ICE是用C++编写的,不管用什么语言,你都需要先用C++编译出一个ICE才行(或者下载已编译的版本)。

Ice应用的结构如下:

Slice 语言

Slice Specification Language for Ice )是一种用于使对象接口与其实现相分离的基础性抽象机制。Slice 在客户与服务器之间建立合约,描述应用所使用的各种类型及对象接口。这种描述与实现语言无关,所以编写客户所用的语言是否与编写服务器所用的语言相同,这没有什么关系。 Slice 定义由编译器编译到特定的实现语言 。编译器把与语言无关的定义翻译成针对特定语言的类型定义和  API 。开发者使用这些类型和 API  来提供应用功能,并与  Ice  交互。用于各种实现语言的翻译算法称为语言映射( language mappings )。

Slice与C++的映射关系(参考来自网络):

SliceC++#include#include#ifndef#ifndef#define#define#endif#endifmodulenamespaceboolboolbyteIce::ByteshortIce::ShortintIce::IntlongIce::LongfloatIce::FloatdoubleIce::DoublestringIce::stringenumenum(不支持指定数字)structstructclassclass(所有方法都是纯虚函数)interfacestruct(所有方法都是纯虚函数,没有成员变量)sequence<T>std::vector<T>dictionary<Key,Value>std::map<Key,Value>exception Errclass Err:public Ice:UserExceptionnonmutating方法限定符const方法idempotent方法限定符-out 参数限定符引用类型*对应类型的代理类

注:本篇文章以C++语言作为演示语言,其它语言除语法不同外,使用方法非常类似。

在Linux环境下配置ICE开发环境

1.从http://www.zeroc.com/download.html下载ICE ,我下载版本为Ice-3.5.1-el6-x86_64-rpm.tar.gz

2.解压后进行安装分别安装:

#rpm -ivh ice-3.5.1-1.rhel5.noarch.rpm

#rpm -ivh db53-5.3.21-1ice.rhel5

#rpm -ivh ice-libs-3.5.1-1.rhel5

#rpm -ivh ice-utils-3.5.1-1.rhel5

#rpm -ivh ice-servers-3.5.1-1.rhel5

3.根据需要安装宿主语言支持,本文为C++

安装 db53-c++、ice-c++、ice-c++-devl  rpm安装包

ICE 的HelloWorld

下面是一个简单的接口的Slice定义:

module Demo {    interface Printer {        void printString(string s);    };};

它定义一个Printer接口(interface),这个接口只有一个printString方法,输入参数是一个字符串(string)。最后,这个接口位于Demo模块(module)之下。

把它保存为Printer.ice后接着我们使用slice2cpp程序依据这个Slice定义生成C++使用的头文件和对应的代理代码:

slice2cpp Printer.ice
生成Printer.h和Printer.cpp,把这两个文件加入到服务器端项目和客户端项目后就可以互相对话。

编写服务器端代码:

  1. #include <ice/ice.h>
  2. #include <printer.h>  

  3. using namespace std;
  4. using namespace Demo;
  5. //实现printString方法
  6. struct PrinterImp:Printer{
  7.     virtual void printString(const ::std::string &s,
  8.         const ::Ice::Current & = ::Ice::Current()){
  9.         cout << s << endl;  
  10.     }
  11. };
  12. int 
  13. main(int argc, char* argv[])
  14. {
  15.     Ice::CommunicatorPtr ic;
  16.     try{
  17.         // 初始化Ice运行库
  18.         ic = Ice::initialize(argc, argv);
  19.         // 建立ObjectAdapter(对象适配器),命名为SimplePrinterAdapter
  20.         // 绑定端口:使用默认协议(一般是tcp)并在10000端口监听。
  21.         Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints(
  22.                 "SimplePrinterAdapter""default -p 10000");
  23.         // 把Printer加入ObjectAdapter,并命名为SimplePrinter
  24.         Ice::ObjectPtr object = new PrinterImp;
  25.         adapter->add(object, ic->stringToIdentity("SimplePrinter"));
  26. //启动适配器
  27.         adapter->activate();
  28.         //等待直到Communicator关闭
  29.         ic->waitForShutdown();
  30.     }
  31.     catch(const Ice::Exception &e){
  32.         cerr << e << endl;
  33.     }
  34.     catch(const char* msg){
  35.         cerr << msg << endl;
  36.     }
  37.     // 回收Ice运行库所用的资源
  38.     if(ic) ic->destroy();
  39.   
  40.     return 0;
  41. }

客户端代码:

  1. #include <ice/ice.h>
  2. #include <printer.h>
  3. using namespace std;
  4. using namespace Demo;
  5. int 
  6. main(int argc, char* argv[])
  7. {
  8.     Ice::CommunicatorPtr ic;
  9.     try{
  10.         // 初始化Ice运行库
  11.         ic = Ice::initialize(argc, argv);
  12.         //获得Ice对象代理,SimplePrinter-对象标识符,default -p 10000-协议与端口
  13.         Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
  14.         // 把对象转换成Printer代理
  15.         PrinterPrx printer =  PrinterPrx::checkedCast(base);
  16.         if(!printer) throw "Invalid Proxy!";
  17.         // 调用printString方法操作
  18.         printer->printString("Hello World!");
  19.     }
  20.     catch(const Ice::Exception &e){
  21.         cerr << e << endl;
  22.     }
  23.     catch(const char* msg){
  24.         cerr << msg << endl;
  25.     }
  26.     // 回收Ice运行库所用的资源
  27.     if(ic) ic->destroy();
  28.   
  29.     return 0;
  30. }

编译服务器端和客户端:

//服务端  c++ -I. -I$ICE_HOME/include -c Printer.cpp Server.cpp  c++ -o server Printer.o Server.o -L$ICE_HOME/lib -lIce -lIceUtil  //客户端  c++ -I. -I$ICE_HOME/include -c Printer.cpp Client.cpp  c++ -o client Printer.o Client.o -L$ICE_HOME/lib -lIce -lIceUtil 

然后启动一个服务器端,每次调用客户端后服务器端会显示一行Hello world!

你也可以把服务器端放到别的电脑上,客户端代码改成:Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -h 服务端IP -p 10000");即可实现远程调用。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拼多多收货码短信没了怎么办 淘宝运费险快递单号填错怎么办 如果淘宝小二判定退款不同意怎么办 商品退回卖家电话关机不收货怎么办 咸鱼等待卖家提供凭证超时怎么办 闲鱼等待卖家上传凭证超时怎么办 集运仓说有违禁品不能入库怎么办 转运停止寄到转运仓了怎么办 为什么阿里免费开店会被限制怎么办 e盘里的文件已经更改或移动怎么办 决斗之城忘了在那个服务器怎么办 ipad需要激活锁忘了id怎么办 小米非系统储存空间满了怎么办的 学生打暑假工被代理拖欠工资怎么办 华为畅享7plus进水了怎么办 华为荣耀6plus喇叭坏了怎么办 华为荣耀7x听筒声音小怎么办 华为智能手表开不了机了怎么办 华为手机重启忘记解锁密码怎么办 华为荣耀8手机开不开机怎么办 苹果5c手机开机密码忘了怎么办 魅蓝note6打王者掉帧怎么办 王者荣耀6月26日活动怎么办 荣耀v9玩刺激战场掉帧怎么办 华为荣耀v9进水开不开机怎么办 魅蓝2玩游戏超卡怎么办 华为手机突然黑屏开不了机怎么办 三星a9开机混合密码忘了怎么办 三星a9锁屏密码忘了怎么办 华为6x手机电源键失灵怎么办 华为手机更换主题后图标不变怎么办 手机屏幕上的拨打电话键没了怎么办 小米手机电用完了充不进去怎么办 华为微信分身版本过低怎么办 手机连接不上4g网络怎么办办 手机通话时老返回锁屏怎么办 小米手机指纹解锁按键不灵了怎么办 小米手机4s黑屏开不了机怎么办 手机老年机突然黑屏开不了机怎么办 苹果7P遮挡传感器就黑屏怎么办 手机被偷支付宝的钱被偷怎么办