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