|
|
提及客户服务器之间的通信,很容易想到TCP/IP,Socket,或者完成端口等一些具体的实现技术和方法。目前传统且经典的通信方式是两者之间定义消息的格式和内容,也即通信协议,按照不同的功能定义不同的消息,这种方式虽然简单,直观;但也会带来诸如维护,扩展等方面的问题。在实施过程中,消息及其结构需要精心定义,但随着开发过程的展开,和进度上的压力;消息的定义可能变得随意,导致各种功能的消息之间相互参杂,给进一步扩展和定义新功能带来很多的麻烦,甚至混乱。
采用面向对象技术能够解决大部分问题;类似在语言编程方面,C++面向对象编程在国内基本上从92年左右开始,其得到快速发展,原因何在?难道使用C++编写的程序,使用单纯的C实现不了吗?诚然不是。面向对象的语言带来的是一种编程模式,在这种模式下,通过继承,重载等概念,使程序易于管理,易于维护和扩展;因此面向对象技术,是C语言的一种管理和组织方式。
通信中使用对象技术,使应用者或者开发者不再面对底层的通信细节,不需要再为定义消息及其结构而大费苦心,初步听起来或许有些抽象。目前的一些分布式技术,诸如:DCOM/Cobra等正是朝该方向进行的努力和尝试。在客户端生成对象的桩或者代理,通过远程调用过程调用对象的函数,完成与服务器之间的通信,但是目前的分布式对象技术不适于细粒度的应用。
SRP分布式对象平台是目前所知的一款支持细粒度的分布式对象模型和平台,完成客户和服务器之间的通信和对象管理,其特点和优点可以参考网站http://www.srplab.com相关文档。下面一个例子说明何为基于分布式对象的通信。
在网游中,玩家包括有一些状态和动作,状态诸如:生命值,经验值,技能等等,动作诸如行走,攻击等,不同的类型的玩家或者npc,不同的游戏,这些内容是不同的。在传统的方式中,需要定义很多消息类型和结构,并且不同的游戏之间是不同的,需要重新定义,在定义过程中,很容易产生前面提及的问题,不同功能的消息之间结构参杂,不易于维护,给游戏项目的开发带来很大的隐患。采用对象技术,不同类型的玩家和npc定义为不同的对象。对象包含属性和方法。
对象属性在发生变化时,由分布式对象平台负责将属性传递给客户端。服务器端直接修改对象的属性,客户端通过平台感知对象属性的变化,更新相应的显示。服务器端远程调用对象的功能,就像本地调用一样,客户端同样可以远程调用对象的功能。比如,鼠标点击某位置,在客户端可以远程调用Object.RemoteCall(Function,MouseX,MouseY),实现客户端与服务器端的通信。
对象的属性:
1. 服务器端发成变化时,由平台自动同步到客户端。
2. 当客户端初始连接时,服务器自动将相关客户的属性,同步到该客户端。
服务器端采用直观的方式修改对象的属性,完全屏蔽了对消息及其结构的定义。
对象的功能(玩家的动作)
1. 客户端直接调用服务器端对象的函数
2. 客户端直接调用客户端对象的函数。
同样屏蔽了对消息及其结构的定义,在SRP分布式对象平台上,支持客户端异步远程调用,和服务器端远程调用的异步处理。
客户端异步远程调用,调用之后,客户端不需要等待返回结果,设置回调函数,当服务器返回结果之后调用相应的回调函数。
服务器端远程调用的异步处理。对于客户端的调用,服务器端有时不能够立即返回,比如需要查询数据库,当查询完成之后,才能够返回结果。
采用分布式对象的模型,将服务器和客户端之间通信的消息定义方式,转换为对象属性的修改和远程函数调用。对象具有明确的含义,易于维护,各个对象之间比较清晰,不易于混杂在一起。对于开发较大规模的网游,或者网游之间模块的共享,与基于消息的通信方式相比,明显具有优势。
|
|