char strGroupName'16';// 16个字节的工作组名字
char strDataName'16'; // 16个字节的数据名字
};
(2)服务器接收到查询时,按照 DataQuery结构中的strGroupName和strDataName进行搜索。如果该数据不存在,Server向Client发送一个FALSE标志。如果该数据存在,服务器先向客户机发送一个TRUE标志,之后立即再向客户机发送该数据(DataPublish格式)。
如果客户机得到TRUE标志的查询结果,就调用函数SubscribeData来接收服务器发送过来的数据。
三、客户程序的“组播”协议
客户机先调用函数QueryGroupIP向服务器发送一个GroupAddress格式的报文,用于查询组播地址。服务器返回相应的十进制点分式的IP地址。
struct GroupAddress
{
BYTEiDataType;// 2 个字节数据类型,宏定义为GROUP_ADDRESS
char strGroupName'16';// 16个字节的工作组名字
};
客户机调用函数MulticastMessage向指定的组(根据组播地址)播放消息。组播的数据报结构 DataMulticast定义如下:
struct DataMulticast
{
DWORDdwContentType;// 组播的数据报类型,由用户定义
char*pchContent;// 组播的数据报内容,由用户定义
};
如果客户机接收到组播的消息,将自动调用函数MessageResponse来响应该消息。MessageResponse是虚函数,它将根据dwContentType信息决定如何处理到来的组播消息,具体功能由用户定义。
5。5。3。2 CNC 服务器的设计
一、数据结构
CNC 服务器的数据结构主要由三部分组成:
(1)一张用于管理组播地址的链表。组播地址由服务器动态生成,客户机可以向服务器查询任意组的组播地址。
(2)一张用于管理线程指针的链表。服务器采用多线程并发处理技术,使客户机获得最快的响应。
(3)每个组都有一张用于管理“发布—订阅”的数据的Hash表。由于同一时刻,系统可能存在多个生产者与消费者,数据的存入、取出速度成为服务器性能的重要指标。Hash表可以提供比链表更快的数据检索速度。Hash表中的数据项结构见DataElement :
struct DataElement
{
charstrGroupName'16';// 工作组的名称
charstrDataName'16';// 数据的名称
BYTEiStorageType;// 存储类型: STORAGE_FILE 或 STORAGE_MEMORY
ColeDateTimeTimeToDie;// 作废时刻
BOOLbLock;// 锁定标志: TRUE 或 FALSE
DWORDdwLength;// 数据的长度
char*pchContent;// 数据内容
};
存储类型(iStorageType)的用途:把数据全部保存在内存中将非常消耗服务器的内存资源,在很多情况下是没有必要的。为了提高内存的使用效率,服务器仅把生命期较短或者长度较短的数据保存在内存中(即为STORAGE_MEMORY类型),而把生命期较长或者长度较长的数据保存在文件中(即为STORAGE_FILE类型)。
作废时刻(TimeToDie)的用途:客户机发布的数据均指定了生命期,服务器在接收到数据时即可计算出作废时刻。服务器将定期扫描Hash表,若发现有数据超出作废时刻(并且没有被锁定),即可删除此数据。
锁定标志(bLock)的用途:很多客户机可能同时订阅某个数据,而该数据可能已超出作废时刻即将被删除。为避免冲突,规定只要有客户机订阅数据,就用iLock标志来锁定此数据,直到订阅完成后才消除锁定。
二、多线程并发技术
服务器有一个主线程和多个子线程。主线程负责客户机的入连接请求,然后创建一个子线程来处理这个TCP连接。每个子线程按照CNC API的协议与客户机通讯。由于有多个子线程共享服务器中的数据,多线程对共享资源的同步访问成为实现的难点。CNC 主要采用了关键区、互斥对象等同步手段解决这个问题。
三、Winsock的使用
CNC 1。0运行于Windows 9x/NT系统下,底层的网络通讯程序用Winsock编写。Winsock有两种工作方式:阻塞方式和非阻塞方式。阻塞方式的优点是编程简单,可靠性好。缺点是容易使应用程序阻塞住,不能处理其它事务。非阻塞方式是利用Windows 消息机制实现的。优点是在数据到来的时候,系统向应用程序窗口发送消息,使得应用程序不必总在等待数据,提高了工作效率。缺点是在发送和接收数据时,应用程序并不将事情做完(不阻塞),以至于应用程序要维护复杂的状态机。
鉴于阻塞方式和非阻塞方式各有优缺点,CNC 服务器采用了混合方式。主线程采用非阻塞的消息驱动方式,可以快速响应客户机的入连接。在子线程中,仍采用非阻塞的消息驱动方式接受客户机的请求,只有在响应请求时,采用阻塞的方式一次性地完成数据的发送或接收。
5。5。4 应用示例
图5。17、图5。18是参加协同工作的两个客户程序示例,这两个程序均用Intra3D 2。0 和CNC 1。0开发。图5。17的客户程序向CNC 服务器订阅 。3ds和 。obj格式的多边形模型数据并执行交互式绘制。图5。18的客户程序向CNC 服务器订阅商业统计图形数据并执行交互式绘制。另有一个客户机(数据源)向CNC 服务器发布各种数据,并用组播来通知各个客户机当前发布了什么数据(短消息)。
Intra3D 2。0和CNC 1。0目前已经可以实用,请与作者联系,免费索取软件。
5。6 小 结
让我们用著名3D游戏软件Quake的设计师Michael Abrash 的话总结本章:“所有真正杰出的设计一旦被设计好,看起来都是那么的简单和显而易见。但是在获得杰出设计的过程中,需要付出令人难以置信的努力。”'Abrash 1998'
图5。17 绘制。3ds和。obj模型的客户程序
图5。18 绘制商业统计图形的客户程序
第六章 C++面向对象程序设计
六年前,我刚热恋“面向对象”(Object…Oriented)时,一口气记住了近十个定义。六年后,我从几十万行程序中滚爬出来准备写点心得体会时,却无法解释什么是“面向对象”,就象说不清楚什么是数学那样。
软件工程中的时髦术语“面向对象分析”和“面向对象设计”,通常是针对“需求分析”和“系统设计”环节的。“面向对象”有几大学派,就象如来佛、上帝和真主用各自的方式定义了这个世界,并留下一堆经书来解释这个世界。
有些学者建议这样找“对象”:分析一个句子的语法,找出名词和动词,名词就是对象,动词则是对象的方法(即函数)。
当年国民党的文人为了对抗毛泽东的《沁园春·雪》,特意请清朝遗老们写了一些对仗工整的诗,请蒋介石过目。老蒋看了气得大骂:“娘希匹,全都有一股棺材里腐尸的气味。”
我看了几千页的软件工程资料,终于发现自己有些“弱智”,无法理解“面向对象”的理论,同时醒悟到“编程是硬道理。”
面向对象程序设计语言很多,如Smalltalk、Ada、Eiffel、Object Pascal、Visual Basic、C++等等。C++语言最讨人喜欢,因为它兼容C语言,并且具备C语言的性能。近几年,一种叫Java的纯面向对象语言红极一时,不少人叫喊着要用Java革C++的命。我认为Java好比是C++的外甥,虽然不是直接遗传的,但也几分象样。外甥在舅舅身上玩耍时洒了一泡尿,俩人不该为此而争吵。
关于C++程序设计的书藉非常多,本章不讲C++的语法,只讲一些小小的编程道理。如果我能早几年明白这些小道理,就可以大大改善数十万行程序的质量了。
6。1 C++面向对象程序设计的重要概念
早期革命影片里有这样一个角色,他说:“我是党代表,我代表党,我就是党。”后来他给同志们带来了灾难。
会用C++的程序员一定懂得面向对象程序设计吗?
不会用C++的程序员一定不懂得面向对象程序设计吗?
两者都未必。就象坏蛋入党后未必能成为好人,好人不入党未必变成坏蛋那样。
我不怕触犯众怒地说句大话:“C++没有高手,C语言才有高手。”在用C和C++编程8年之后,我深深地遗憾自己不是C语言的高手,更遗憾没有人点拨我如何进行面向对象程序设计。我和很多C++程序员一样,在享用到C++语法的好处时便以为自己已经明白了面向对象程序设计。就象挤掉牙膏卖牙膏皮那样,真
小说推荐
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 最新章:第26章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 最新章:第295章
- 超级软件
- 《超级软件》作者:钓鱼超级软件 第一卷 大脑也能装软件序 章 君子以自强不息“李天纵,一起去玩魔兽,哥几个带你练级”下午最后一节课结束以后,教室里的同学都开始吵吵晚上要去哪里玩耍。被叫做李天纵的男生中等身材,外形俊朗阳光,薄薄的双唇紧紧抿着,显得很有性格。他略一犹豫,摇摇头“不了,下次吧,我等会还有
- 最新章:第330章
- 交友软件
- 《交友软件》作者:安颜 文案 论约到自己男神是种什么体验 演技负分智商下线总裁攻x外表冷漠内心狂热美人受 炮友变情人 一个演技负分一个配合表演最后还演到一起去的故事 1v1 狗血有 小虐有 女装有第一章 祁明思第一次在交友软件上看到这个男人(也可能是个男孩)的照片的时候,出于对美的事物的欣赏,默默点
- 最新章:第30章
- 修仙软件
- 作者:稀凤】正文第一章 穿越异界和煦的春光照在千灵峰后山,一阵清风吹过,带着淡淡菊花香,诱人入睡。竹叶斑斑,菊花遍开,昭示这座山峰的灵秀。萧泽尧躺在山丘上睡觉,面朝太阳。来这个世界也有三个多月了,他现在所在的门派是三大正宗的仙门,其他两巨头是神殿和圣谷。混沌初开,天地有别,有仙自然有魔。伫立于三大正
- 最新章:第132章
- 软件帝国
- 《软件帝国》作者:香港大亨[软件帝国 香港大亨 著/书籍介绍:何笑的大脑中有个炼丹炉—炼的不是丹药,而是程序和软件!卡巴斯基很牛?放到何笑的炉子中炼一炼,就可以炼出比卡巴斯基还牛的杀毒软件。网站开发很难吗?额,把网站转移到炼丹炉中炼一晚上,一个更完美的网站系统被开发出来了.这是全新的创意,一个能带给
- 最新章:第268章
- 未来软件
- [未来软件 迪厅肥猫 著]书籍介绍:罗宁,刚刚失恋的他又丢了工作。可谓赔了夫人又折兵。但是这也是他奇遇的开始“你是谁“我是你未来的老婆“我去!真的假的”一部山寨手机!但是软件很牛奔!不但可以跟未来的老婆聊天,还能玩各种各样的‘特殊游戏’于是乎他成了世界上最牛奔的主。喜欢的筒子加群:33629503-
- 最新章:第268章
- 我是杀毒软件
- 好书尽在.w 文案 我游走在黑暗与光明之间,杀戮是我的挚友,邪恶是我的仆从,白骨累累化作我的权杖,鲜血殷殷染红我的披风,阴冷双翼所过之处,死亡的哭号必将震天动地 我是死神 同时也是一个杀毒软件。第一章 杀毒程序小兵 每一次呼吸之间,都像是一万年那么漫长 记忆中的碎片不断组合,重叠,犹如一场场离奇的梦
- 最新章:没有后记的后记
- 都市之超神软件
- 简介:刘小陈意外获得一个来自两千年后的手机软件,从此开始非凡人生!拳打流氓汉!脚踹装逼犯!从来不怂,就是爱干“如果有一天你看见我暴打装逼犯,哥想说,哥打的不是人,是无敌的寂寞”书友兄弟群:98295第1章 叫的这么销魂)齐州市大马路上“啪”当爱疯6被摔在地上那一刻,刘小陈双眸呆滞,不敢相信!这爱疯6
- 最新章:第459章