- 浏览: 138115 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
Ken艹小哲:
太赞了 哥们 加扣
猜数字问题的最少步数算法. -
chenyuan122912:
...
解决AS3 Socket编程中最令人头疼的问题 -
hyx0914:
有源代码打包下载的吗?
Flex地图分块加载的实现 -
tianhai110:
非常有价值的 测试总结
时间效率,Timer和EnterFrame在FP 10.1之后测试和建议 -
763675117:
你好,fengxiangpiao,看了你的文档,我的需求和你差 ...
解决MovieClip打印问题 转
类似于SLG这类游戏,对游戏的实时交互要求不是很高,所以一般选择的都是通过HTTP协议,进行前后台数据交互。但随着用户对游戏的需求越来越高,MMORPG也逐步出现在webgame之中,诸如昆仑、乐土这类回合制MMORPG-Webgame。由于HTTP是短连接,不能适应这种长连接的网络需求。所以肯定是需要使用socket进行网络连接的。虽然COMET也能达到类似的目的,但是性能上还是难以达到socket的水平,所以在商业化应用上还是比较少考虑的。
本文不会涉及到用何种语言实现socket连接来传递数据,主要内容是根据实际的经验,和大家讨论下服务器端和客户端之间传递的数据及数据结构的一些问题。
首选说几个名词:
1、封包
大家在使用互联网的时候,所有的数据都是被打成一个包发出去的,这个包不是压缩包(zip\rar),而是有一定数据结构的二进制数据。封包的主要内容是数据信息,含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之间可以通过路由协议来进行路由信息的交换,从而更新路由表。
在设计游戏的封包中,我们只关心数据信息,而其他的不需要关心。
2、字节(Byte)
大家对对MB,KB肯定不陌生,也一定知道MB或KB中的B就是Byte。Byte是存储空间的基本计量单位。一般来说一个ASCII码就占用一个字节,比如'A'或者1
3、位
既然知道了字节,那么字节由什么组成呢,那就是位了。是计算机中最小的数据单位。一个字节由8个二进制位构成,如00001111。ASCII码是都可以转换成二进制的。如下表
二进制 十进制 十六进制 字符
00110001 49 31 1
00110010 50 32 2
00110011 51 33 3
00110100 52 34 4
00110101 53 35 5
00110110 54 36 6
00110111 55 37 7
00111000 56 38 8
00111001 57 39 9
1、协议设计
一般来说我们都会设计一个协议,这个协议指明了,这个封包的数据的作用是什么。一般我们都会用数字来代表协议。
如:
登陆登出 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 +
+--------+--------+--------+--------+--------+--------+---------+----------+
在整个封包中,还可以加入更多的元素,比如加密,奇偶校验等,这些要根据实际情况来设计包的结构,这些需要大家在实际的项目中去体会和发现。
本文只是对封包做了一个概要性的讲解,不足、漏洞、不合理肯定是比比皆是。希望大家能指出来一起讨论,也希望能看到有更好的想法提供给大家。
发表评论
-
最全的Flex网站
2011-10-15 23:18 735一、国外站点 1.资源 类Adobe Flex 2 ... -
时间效率,Timer和EnterFrame在FP 10.1之后测试和建议
2011-04-23 22:19 1062关于Timer还是EnterFrame的选择,一直是很 ... -
时间效率,Timer 和 EnterFrame 在 FP 10.1 之后测试和建议
2011-04-23 22:16 1063关于Timer还是EnterFrame的选择,一直是很多AS3 ... -
Socket粘包问题
2011-04-22 23:21 1033这些天做类似QQ空间的 ... -
关于Flash Socket通信的安全策略问题的一点心得
2011-04-22 22:36 702昨天做测试的时候遇到 ... -
FLEX入门实例--------FLEX全屏功能实现及右键菜单
2011-03-26 11:58 817FLEX的全屏功能的实现,光写AS还不够,还需要对JS部分做一 ... -
flex中的Text属性
2010-12-08 12:31 874不同于Lable只显示单行文本,Text可以显示多行文本, ... -
Flex跨域问题
2010-11-08 17:55 792From ESRI: The client brow ... -
Flex屏蔽并自定义鼠标右键菜单(转载)
2010-11-08 17:53 885最近手头有个项目需要屏蔽Flex鼠标右键菜单并自定义新的fle ... -
使用 IBM Rational Functional Tester 7.0.1 测试 Flex 应用程序
2010-11-05 21:45 846关于这篇文章必要的信息 这篇文章假定您已经对使用 IBM® ... -
在 Ajax 应用程序中实现实时数据推送
2010-11-05 21:40 671简介 Ajax 技术已经存在了一段时间,开发的动力已经真正开 ... -
使用 Flex 和 Dojo 开发交互式Web应用程序
2010-11-05 21:38 997引言 以用户体验为核 ... -
Flex 应用内存泄露的分析与诊断
2010-11-05 21:36 807引言 Flex 采用 ActionScrip ... -
flex SystemManger
2010-11-05 16:35 693软件编程牛人网 Framework Fundamentals ... -
Flex 不同 application 之间传参数
2010-11-05 16:33 489软件编程牛人网 通过主影片来获得所有子影片的systemma ... -
如何在flash保留小数位
2010-11-04 20:07 827在家上网赚钱更容易 fl ... -
实例讲解Flex3的SharedObject对象用法
2010-11-04 16:01 760在家上网赚钱更容易 Flex中的SharedObj ... -
Flex中12个最基本、最简单但却最有用的函数
2010-11-04 15:54 692在家上网赚钱更容易 No.1 复制内容到剪贴板 S ... -
谈谈Flex中ArrayCollection的复制(克隆)
2010-11-04 15:51 730在家上网赚钱更容易 在Flex的开发过程中,常常会遇到复 ... -
flex中的拖放操作(一)
2010-11-04 15:47 938在家上网赚钱更容易 可视化的开发环境最大的特点是允许你在 ...
相关推荐
实时游戏的网络协议设计是构建在线游戏不可或缺的一部分,它涉及到数据传输、同步、延迟处理以及错误恢复等多个关键领域。在本文中,我们将深入探讨实时游戏网络协议的核心概念、设计原则和常见技术。 首先,我们...
通过这个校园网搭建及网络协议分析的课程设计,学生可以全面了解网络基础设施的规划、实施和优化,为未来在IT领域的工作打下坚实基础。同时,VLAN技术的应用展示了如何通过网络分段提升网络效率和安全性,这对于现代...
通过"网络协议图1.gif"和"网络协议图2.jpg",你可以清晰地看到这些协议是如何相互配合工作的,这对于初学者理解和网络开发人员设计网络应用都非常有帮助。理解网络协议的工作原理,有助于我们更好地优化网络性能,...
网络游戏设计及其平台的设计与开发是信息技术领域中的一个重要分支,它涉及到多方面的技术和理论知识。这篇毕业设计论文旨在探讨如何创建一款网络游戏以及构建其配套的游戏平台,以提供丰富的用户体验。 网络游戏...
总的来说,理解并掌握网络协议规范对于从事网络相关的任何工作都是必不可少的,无论是设计网络架构、优化网络性能,还是排查网络故障,都离不开对这些规范的深入学习和应用。因此,这份"网络协议规范大全"对于IT专业...
网络游戏中的网络协议引擎是游戏开发中的重要组成部分,它负责处理游戏中所有与网络相关的通信,确保玩家之间的交互流畅、实时,并且稳定。网络协议引擎的设计和实现对于网络游戏的成功至关重要,因为它直接影响到...
《网络游戏-基于射频能量收集的无线传感器网络MAC协议设计方法》 在现代网络游戏的开发与运营中,无线传感器网络(Wireless Sensor Networks, WSNs)的应用日益广泛,尤其是在环境监测、玩家行为分析和游戏场景模拟...
4. UDP协议:UDP(用户数据报协议)是一种无连接的、不可靠的传输协议,适用于实时数据传输如视频流和在线游戏。研究UDP的源代码,可以了解其如何通过最小的头部开销实现高效的数据传输。 5. DNS协议:DNS(域名...
网络游戏中的网络协议报头压缩方法是优化网络游戏性能的关键技术之一。在网络游戏的实时通信中,数据传输效率至关重要,因为延迟和带宽限制可能直接影响玩家的游戏体验。报头压缩旨在减少在网络上传输的数据量,从而...
**网络协议软件编程_网络程序设计_网络编程_WINSOCK_ 实验指导书** 网络编程是计算机科学领域的重要组成部分,特别是在互联网技术飞速发展的今天,掌握网络编程技能对于IT专业人士至关重要。本实验指导书主要围绕...
RTP是一种广泛用于音频、视频等实时数据传输的互联网标准协议,尤其在网络游戏中,它能够确保数据的低延迟传输,从而提供更流畅的游戏体验。 端到端网络测量是指从数据发送方到接收方的全程监控,包括了数据在网络...
网络游戏的开发与设计是一项复杂而综合的工作,涵盖了多个IT领域的知识。这个毕业设计项目包括了服务器和客户端的构建,以及3D引擎的应用,是学习和实践C++编程、网络通信和游戏开发技术的一个典型实例。 首先,...
在本压缩包中,我们关注的是"C#网络编程高级篇之网页游戏辅助程序设计软件包",这是一份专门针对C#编程语言在网络编程领域的高级应用,特别是涉及到网页游戏辅助程序设计的实例代码。这份资源对于想要深入学习C#网络...
C#本科毕业设计基于Tcp_Ip协议的1v1网络对战游戏源代码.。包括服务端 教程如下: 执行Mysql文件,数据库连接账户名为root,密码为root 开启服务端 开启客户端 使用说明 客户端界面,若连接成功,可使用数据库内已有...
网络五子棋游戏的关键在于实时的网络通信。项目中可能采用了Socket编程来实现客户端与服务器之间的数据交换。Socket允许两个网络连接上的进程进行双向通信,玩家的每一步操作都需要通过Socket发送到服务器,服务器再...
《网络五子棋小游戏设计详解》 五子棋是一种古老而深奥的棋类游戏,深受全球玩家喜爱。在网络技术高度发达的今天,将五子棋搬到线上,实现网络对战,不仅增加了游戏的趣味性,也使得玩家可以随时随地与他人切磋棋艺...
常用于实时应用如视频流和在线游戏。 4. IP(互联网协议):IP是网络层的核心,负责将数据包从源主机传输到目的主机。IPv4和IPv6是两个主要版本,其中IPv6正在逐渐取代IPv4以解决地址枯竭问题。 5. DNS(域名系统...