实时游戏的网络协议设计.doc

上传人:wux****ua 文档编号:9063229 上传时间:2020-04-02 格式:DOC 页数:4 大小:36.52KB
返回 下载 相关 举报
实时游戏的网络协议设计.doc_第1页
第1页 / 共4页
实时游戏的网络协议设计.doc_第2页
第2页 / 共4页
实时游戏的网络协议设计.doc_第3页
第3页 / 共4页
点击查看更多>>
资源描述
类似于SLG这类游戏,对游戏的实时交互要求不是很高,所以一般选择的都是通过HTTP协议,进行前后台数据交互。但随着用户对游戏的需求越来越高,MMORPG也逐步出现在webgame之中,诸如昆仑、乐土这类回合制MMORPG-Webgame。由于HTTP是短连接,不能适应这种长连接的网络需求。所以肯定是需要使用socket进行网络连接的。虽然COMET也能达到类似的目的,但是性能上还是难以达到socket的水平,所以在商业化应用上还是比较少考虑的。本文不会涉及到用何种语言实现socket连接来传递数据,主要内容是根据实际的经验,和大家讨论下服务器端和客户端之间传递的数据及数据结构的一些问题。首选说几个名词:1、封包大家在使用互联网的时候,所有的数据都是被打成一个包发出去的,这个包不是压缩包(ziprar),而是有一定数据结构的二进制数据。封包的主要内容是数据信息,含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之间可以通过路由协议来进行路由信息的交换,从而更新路由表。在设计游戏的封包中,我们只关心数据信息,而其他的不需要关心。2、字节(Byte)大家对对MB,KB肯定不陌生,也一定知道MB或KB中的B就是Byte。Byte是存储空间的基本计量单位。一般来说一个ASCII码就占用一个字节,比如A或者13、位既然知道了字节,那么字节由什么组成呢,那就是位了。是计算机中最小的数据单位。一个字节由8个二进制位构成,如00001111。ASCII码是都可以转换成二进制的。如下表二进制 十进制 十六进制 字符00110001 49 31 1 00110010 50 32 200110011 51 33 3 00110100 52 34 400110101 53 35 5 00110110 54 36 600110111 55 37 7 00111000 56 38 8 00111001 57 39 91、协议设计一般来说我们都会设计一个协议,这个协议指明了,这个封包的数据的作用是什么。一般我们都会用数字来代表协议。如:登陆登出 1聊天 2移动 3所以我们可以这样设计数据协议-控制器 登陆登出 1-动作 登陆 1动作 登出 2-控制器 聊天 2-动作 私聊 1动作 世界 2动作 队伍 3-控制器 移动 3-动作 移动 1这样就构成了数据结构:控制器,动作,DATA如世界聊天:2,2,DATA; 移动:3,1,DATA这样客户端和服务器端就能根据控制器和动作来调用不同的程序来处理DATA中的数据。而DATA也有自己的结构,这个是根据实际的功能来设计的。比如私聊,就设计成:2,1,from,to,msg如果我们使用socket传输字符串,那么客户端和服务器端收到这样的数据后就可以进行处理了。2、封包设计在协议设计中,我们是使用的字符串组成的协议,而为了降低网络开销,一般使用二进制来传递数据。这样可以大大降低包的长度。节省网络带宽。之前我们在协议设计了控制器和动作,现在我们加一个返回值,返回值代表了控制器和动作的结果,而不是数据本身。那么就构成了这样的数据结构:控制器,动作,返回值,DATA。我们可以把控制器、动作、返回值放到两个字节里面,这就要进行位操作。一个字节有8位,我们可以这样分配位:第一个字节+-4-8+ 控制器 + 动作 +-+-+将一个字节的第1-4位用与控制器,5-8位用于动作第二个字节+-4-8+ 返回值 + 保留 +-+-+将一个字节的第1-4位用与返回值,5-8位保留以作他用如果无返回值,者第二个字节为00000000而DATA中的数据也是使用二进制结构,这就需要根据不用的协议,来写不同的解包程序。也可以写通用的解包程序,那就需要在设计数据结构的时候更要深思熟虑。关于DATA这部分的数据结构的设计,会以后专门进行说明。我们构造出了封包的数据主体,还要标示出这个数据有多长,我们会在长度和数据主体之间加一个分割符,我这里用了0x88或0x86+-16-8-8-4-8-4-n+ 包长 + 0x88 + 控制器 + 动作 + 返回值 + 保留 + DATA +-+-+-+-+-+-+-+这里需要根据实际情况,决定包长使用1个字节还是2个字节,1个字节可以表示255个字节的长度,2个字节可以标示65535的长度在进行socket通信的时候,经常会处理拼包和粘包这些问题。用我们之前设计的数据结构,是无法处理拼包和粘包这些问题的,所以我们还必须把以控制器为单位的包区分开来。比如我们的包构成是:+-16-8-8-4-8-4-n+ 包长 + 0x88 + 控制器 + 动作 + 返回值 + 保留 + DATA +-+-+-+-+-+-+-+我们可以在包前端增加一个字节以进行区分+-8-16-8-8-4-8-4-n+ 0x86 + 包长 + 0x88 + 控制器 + 动作 + 返回值 + 保留 + DATA +-+-+-+-+-+-+-+-+在整个封包中,还可以加入更多的元素,比如加密,奇偶校验等,这些要根据实际情况来设计包的结构,这些需要大家在实际的项目中去体会和发现。本文只是对封包做了一个概要性的讲解,不足、漏洞、不合理肯定是比比皆是。希望大家能指出来一起讨论,也希望能看到有更好的想法提供给大家。
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板表格


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!