ICE基础知识讲解
1 缘由
这是我对张同事花费一小时分享的ICE基础知识的记录。刚开始进入项目的时候也学习过关于ICE相关的知识,因为被调入Web组中没有继续研究了。他组织课程的结构和讲课的方式都非常浅显易懂,同时又能让人收获到知识,很值得学习。我想,学习最高境界就是能够教会别人,厉害!呵呵,下次我也要尝试上台讲讲,加油!
2 简介
Ice 是一种面向对象的中间件平台。由ZeroC公司开发,开源项目是不需要收费的,但如果商用是需要收费的。主要应用于数据量并发,二进制数据传输、支持一定的安全机制传输(例如SSH之类),能够自动冗余处理(在一台机器出现故障时,自动切换到另外一台正常的机器中),以及在不需要更改源代码的情况下,通过增加服务器自动平衡负载的功能等。
3 怎样写ICE程序
会议上举了一个向服务器发送N个字节的示例,由于听课的位置看不清而没记录下来,但从附录中的《Ice-1.3.0_分布式应用(中文版)》中开发客户端和服务器端的章节可以找到类似的资料。
3.1 定义ICE接口文件
采用ZeroC自定义的Slice语言编写,主要完成定义数据结构及接口的功能。当客户端需要使用时,直接从这个接口文件转换成对应的编程语言的源代码(C++, java, C#等)即可。
3.2 在服务器端实现接口
编写完接口文件,ICE会定义一些纯虚的类,我们需要做的就是继承这些纯虚类,然后实现所有的虚函数。
3.3 客户端使用
* 三个基本概念
其中 ICE对象 和 ICE适配器 是在服务器端的,ICE代理是客户端的
+ ICE对象
包含全局唯一标识,寻址信息
+ ICE适配器
监听端口,根据ICE对象的唯一标识,分发网络消息到具体的ICE对象
+ ICE代理
在客户端中代码,能够通过此对象调用到ICE中提供的接口
4 会议中提到的一些问题
4.1 中文路径
ICE不能在中文路径下使用,包括调试或打包后的安装路径都不能包含中文字符
4.2 异常处理
在客户端使用时,出现找不到接口等错误时,ICE接口均会通过异常的方式向外面抛出异常,如果客户端不对这些异常进行处理时,会造成程序崩溃的问题
4.3 接口参数
Slice语言定义的参数,要么是输入参数,要么是输出参数。不能设置一个参数既为输入参数又为输出参数的,即不存在C++中的引用参数
4.4 能否支持中文字符串
ICE会自动将Slice语言中的String转换成STL中的string,也就是说不支持中文字符的。如果能够让其转换成wstring,或许就可以支持中文字符了。
4.5 什么是RPC
RPC即远程过程调用(Remote Process Call),能够使得程序调用远程的函数就像在本地调用一样。
王工举了一个很形象的例子,用C++代码创建文件夹,如果是本地的话,调用本地API创建即可。但是如果要在远程电脑上创建呢?这就可以通过RPC的方式实现了。
4.6 什么是TCPServer
因为ice不支持wince,所以需要自己来编写一个tcpserver来处理。什么是TCPServer呢?TCPServer是一个能处理请求的服务器,需要自定义协议,规定协议的内容,完成用代码解析协议内容,处理请求的功能。而对于客户端,需要按照协议要求组成对应的数据流发送给客户端进行处理。
4.7 不要重复造轮子
上面关于TCPServer是项目经理提出来的,他强调非常不推荐“重复造轮子”,花费很长的时间来选胶、建模等来造出一个轮子,当造出来的时候,可能车子都已经报废了。当然,自己造轮子时非常有激情,能使得在某一方面的技术能够有所增强。但这同时也会浪费很多项目的时间;降低开发者的集成能力;最痛苦的是,如果项目需求经常发生改变,会让开发变得非常痛苦。项目经理就提到,当时开发TCPServer时,光定义协议的文档就改了十多个版本。也需这些经验要经过一定的错误,让自己尝到苦头之后才会明白,但人生能够让自己试错的机会又有多少呢?所以,站在巨人的肩膀上,才能让自己看得更远。
5 参考资料
Ice-1.3.0_分布式应用(中文版).pdf