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

posted @ 2013-08-15 10:00  lvye1221  阅读(49)  评论(0编辑  收藏  举报