利用ICE通信中间件构建分布式应用程序开发框架 NISEC讲座系列之--- ICE网络编程 利用ICE通信中间件构建分布式应用程序开发框架 演讲人:牵牛散步 时间:2007.06.15 地点:JCB-410
---利用ICE通信中间件构建网络应用程序开发框架 在这里我们要讲的可不是冰激淋,而是一种用于分布式程序设计的网络通信中间件ICE(Internate Communications Engine).ICE的设计目标主要是以下几点: • 提供适用于异种环境的面向对象中间件平台。 在用ICE进行分布式程序设计时,你可以不必考虑客户端或 者服务器端程序所运行的平台(WINDOWS或者是LINUX, UNIX),也可以不用关心程序使用的开发语言(不过有一点 需要注意,目前,利用PHP,RUBY等WEB脚本语言只能编 写ICE程序的客户端,而服务器端一般利用C++或者JAVA 来实现). • 提供一组完整的特性,支持广泛的领域中的实际的分布式应用的开发。 • 避免不必要的复杂性,使平台更易于学习和使用。 ICE的学习比较曲线比较短,很容易上手.只要你熟悉某一种 语言(例如C++或JAVA),了解了ICE编程范式之后,很快就能 开发出实际的应用. • 提供一种在网络带宽、内存使用和CPU 开销方面都很高效的实现。 • 提供一种具有内建安全性的实现,使它适用于不安全的公共网络。 支持SSL协议(要使用此协议必须装OPENSSL开发包)
---利用ICE通信中间件构建网络应用程序开发框架 2.中间件技术与物流公司 中间件是在计算机硬件和操作系统之上,支持应用软件开发和运行的系统软件,它能够使应用软件相对独立于计算机硬件和操作系统平台.中间件具有标准的程序接口和协 议,可以实现不同硬件和操作系统平台上的数据共享和应用互操作。在具体实现上,中间件是一个用API定义的分布式软件管理框架,具有强大的通信能力和良好的可扩展性。 从开发者的角度来看,中间件技术为其提供了一个开发分布 式程序的框架即一套API,使其不需要进行枯燥乏味,而且需 要花费大量时间和精力的基础设施的开发.使开发者能把大 量的精力放在业务程序的开发上,提高应用程序的质量和开发效率. 这就好比一个生产手机的厂商,它的客户可能分布在世界 的很多地方(这里假设这个厂商只在一个地方生产手机), 当手机生产出来后,厂商有两个方案,一是自己建立物流部门 去配送手机.二是把这些配送业务交给专业的物流公司去处 理.显然第一种方案是比较合适的,因为该厂商的专长是设计 制造手机,而不是进行物流配送.对该厂商来说,他只需要按照 物流公司的流程,把货交给物流公司,剩下的事情就由物流公 来办,至于公司的产品是用飞机还是轮船运送的,手机厂商可 以完全不关心,它只需要知道产品是否安全,完整的到达目的 地了.对于这家手机厂商来说,此物流公司就是一个”中间件”. 它们就可以把更多的精力放在如何设计和生产更好的产品上.
---利用ICE通信中间件构建网络应用程序开发框架
---利用ICE通信中间件构建网络应用程序开发框架 • 支持同步和异步的消息传递 • 支持多个接口 • 机器无关性 • 语言无关性 • 实现无关性 • 操作系统无关性 • 多线程支持 • 传输机制无关性 • 安全性 • 开放源代码
---利用ICE通信中间件构建网络应用程序开发框架 • Slice (Ice 规范语言) 每个Ice 对象都有一个接口,该接口具有一些操作。接口、操作,还有在客户及服务器间交换的数据的类型,都是用Slice 语言定义的。Slice 允许你以一种独立于特定编程语言(比如C++ 或Java)的方式定义客户-服务器的合约。 Slice 定义由一个编译器编译成特定编程语言的API,也就是说,与你所定义的接口和类型对应的那一部分API,会由生成的代码组成。 • 通信器(Ice::Communicator) ICE在进行通信时,服务器和客户端都必须建立一个通信器, 通信器为该通信进程分配和管理资源,可以把通信器看做通 信双方的一个专用线路. • 对象适配器(Ice::ObjectAdapter) 对象适配器实现了一个向上调用接口,把Icerun time 与 服务器中的应用代码连接在一起. 它提供一个或更多传输端点。客户通过这些端点访问适配 器所提供的Ice对象,即通过适配器访问servant. 一个对象适配器与一个端口绑定.如果服务器端同时监听 两个端口的话必须建立两个适配器.
---利用ICE通信中间件构建网络应用程序开发框架 • 用户代理 客户端通过用户代理来调用服务器端提供的servant.可以把用户代理想象成本地C++程序里的类指针,通过类指针来对实例进行操作. • Servant 即ICE服务器端提供给客户端的服务.也是我们建立最关心的部份.它映射在服务器端就是我们通过SLICE定义编译 生成后的接口类.一个接 口类为一个服务.Servant 必须和某个适配器绑定.
---利用ICE通信中间件构建网络应用程序开发框架 1.ICE在WINDOWS下的安装( FOR VC++ 6.0 WITH SP2) • 下载windows平台下的安装软件包,ICE支持多种开发程序,在这里我们安装Ice-3.0.0-VC60.msi.软件包可以到官方网站去下载:http://www.zeroc.com/download.html • 一路NEXT完成安装.然后需要配置ICE的环境变量.在系统环境变量中配置以下变量: ICE_HOME=<Ice installation root directory> PATH=%ICE_HOME%\bin;%PATH% 配置好后打开命令控制台,输入命令”slice2cpp”如果能看到以下内容则说明ICE安装成功.
---利用ICE通信中间件构建网络应用程序开发框架 • 配置IDE的开发环境,在VC++软件中做以下配置: - Tools->Options->Directories - 选择 “Include files”标签栏 - 增加 <Ice installation root directory>\include 和 <Ice installation root directory>\include\stlport 到列表.然后移动 “\include\stlport”目录到列表的顶部. - 选择 “Library files”标签栏 - 增加 <Ice installation root directory>\lib 到列表. - 选择 “Executable files”标签栏 - 增加 <Ice installation root directory>\bin 到列表. • 配置具体开发工程(以下为配置DEBUG版本,RELEASE版本类似),在VC++软件中做以 下配置: - Project Settings >> C/C++(Tab) >> Category:Code Generation >> User run-time ddlibrary:Debug Multithreaded DLL (ICE是多线程的) - Project Settings >> C/C++(Tab) >> Category:Preprocessor >> Additional include directories:(在此项中填入一个点".",表示根目录) - Project Settings >> C/C++(Tab) >> Category:C++ Language >> 勾选"Enable Run-Time Type Information(RTTI)"项 - Project Settings >> Link(Tab) >> Category:General>>在"Object/library modules:"框中的未首加入两个包"iced.lib"和"iceutild.lib"
---利用ICE通信中间件构建网络应用程序开发框架 2.ICE在LINUX(Red Hat 9)下的安装( FOR C++ ) • 安装要求: - 系统中必须有GCC 3.0以上版本(我们通过源码安装) - 需要至少三个软件包: bzip2-1.0.3.tar.gz ,bzip2-devel-1.0.2-8.i386.rpm, Ice-3.0.0.tar.gz .如果需要ICE的其它服务的话应安装相应软件包.在这里我们 假设这三个软件包都在系统的/usr/drc目录下. • 安装bzip2: #> tar -zvxf bzip2-1.0.3.tar.gz #> cd bzip2-1.0.3 #> make #> cp bzlib.h /usr/include • 安装bzip2-devel: #> rpm –ivh bzip2-devel-1.0.2-8.i386.rpm • 安装ICE: #> tar xzvf Ice-3.0.0.tar.gz #> cd Ice-3.0.0 #> make –i #> make install –i
---利用ICE通信中间件构建网络应用程序开发框架 • 设置环境变量: #> export PATH=/usr/drc/Ice-3.0.0/bin:$PATH • 至此ICE安装完成,在SHELL里输入命令”slice2cpp”如能看到以下提示,则说明ICE安装 成功.
---利用ICE通信中间件构建网络应用程序开发框架 下面,我们用一个类似helloworld的程序来给大家演示一下,一个ICE通信程序是如何编写的.此程序包括两端,一个是客户端程序client,一个是服务端程序server.此程序的功能是:server侦听一个端口60018,client去连接server,连接上后,给server发送一个字符串,server收到字符串后在其屏幕上打印此字符串,并返回一个表示接收成功的串给client,client接收到此串后打印在其屏幕上. 1.首先,我们要定义通信双方的通信接口,既然是接口,那么接口信息是通信双方共享的信息.定义接口通过编写ICE的Slice文件来完成.以下是我们此程序的Slice文件内容: //3.0以后的版本必须把接口定义在模块(module),模块映射为C++里的名字空间 module NisecICE { //定义ICE接口,映射为C++里同名的一个类(纯虚类,因此不能实例化,必须继承并重载类中的相应方法) interface HelloICE //定义接口里的操作,映射为C++里同名的一个纯虚拟方法 string SayHello( string content ); };
---利用ICE通信中间件构建网络应用程序开发框架 2.编译Slice文件,生成相应的.CPP和.H文件: 利用ICE提供的命令”Slice2cpp”对刚才定义的.ice文件进行编译,会生成一个.cpp文件和一个相应的.h文件.这两个文件里就是实现我们接口的相关骨架类.这两个文件通信双方都需要用到. 3.编写服务器端程序,服务器端的程序,一般都是按以下步骤来编写的: -继承相关的接口类,并实现其纯虚函数 建立通信器,并初始化(包括设置通信协议,监听端口,线程池大小等) 创立适配器 创建代理接口并设置代理标识 增加代理到适配器 激活适配器 通信器启动并阻塞,等待处理客户端的请求 关闭通信器,释放相关资源
---利用ICE通信中间件构建网络应用程序开发框架 4.编写客户端程序,一般可以按照以下步骤: -建立通信器,并初始化(包括设置server的IP,协议,端口,连接超时时间,目标代理名等) -建立代理对象 -寻找server代理 -如代理存在,即可通过代理对象调用server上此代理类型所有的操作. -操作完毕,销毁通信器,释放相关资源 5.用ICE进行编程时应注意的问题: -client连接server时一定要注意设置超时时间,不然很容易导致网络阻塞 -在涉及到一些传递通信所需要的参数,如端口,IP,协议等的时候,这些参数应该从配置文件里读取,或者通过参数传递,不要进行硬编码.还有在C++里字符变量的类型应该用std::string,而不要用C语言风格的char[].以避免内存泄漏和指针越界. -在利用多线程进行异步程序开发时,要注意给共享资源加锁,以免导致数据被破坏. -我们利用C++进行ICE程序开发,因此在编写ICE的程序时,例如客户端建立连接
---利用ICE通信中间件构建网络应用程序开发框架 -我们用C++进行ICE程序开发,因此在编写ICE的程序时,例如客户端建立连接客户端时,应该写成一个类,这类至少要包括三个方法,初始化通信器,调用相关操作,销毁通信器.这样当项目组成员需要与服务器进行通信时,只需要实例化此类即可.提高了效率.而不用再自己去写ICE通信客户端. *代码见源程序 www.testnew.net