- 浏览: 1062535 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (695)
- 心情日记 (14)
- AS开发工具 (12)
- 文章转载 (99)
- AIR (5)
- 问题总结 (46)
- SWF格式 (7)
- 测试总结 (10)
- 外文资料 (9)
- 算法技术 (33)
- AS3常用开源库 (43)
- 源码范例 (102)
- FLEX (72)
- FLASH 优化 (33)
- 游戏开发 (49)
- 开发技术 (11)
- 工作应用 (34)
- AS3收集 (140)
- WebBase (0)
- 开发构想 (4)
- 设计模式 (2)
- 框架和框架范例 (19)
- RED5 (3)
- java开发 (3)
- JAVA (1)
- FLASH-3D (23)
- 3D (6)
- 书籍 (10)
- 业界信息资料 (3)
- C# (1)
- JavaScript (12)
- HTML5 (6)
- Flixel (1)
- D5Power RPG网页游戏引擎 (0)
- ColorMatrixFilter - 获得相应颜色的色调 函数 (0)
- Starling (0)
最新评论
-
老顽童203:
字体
水果忍者鼠标跟随特效制作[转载] -
hairball00:
[转] 放出超多的Flash组件源代码 -
he74552775:
flash AS3 RegExp简单功能用法(转) -
hanshuai1232000:
第四点,有利也有弊,等你做了大型的aprg,你就知道了
[转]位图数据内存优化 -
yangfantao:
太感谢
[转] 放出超多的Flash组件源代码
类似于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 +
+--------+--------+--------+--------+--------+--------+---------+----------+
在整个封包中,还可以加入更多的元素,比如加密,奇偶校验等,这些要根据实际情况来设计包的结构,这些需要大家在实际的项目中去体会和发现。
本文只是对封包做了一个概要性的讲解,不足、漏洞、不合理肯定是比比皆是。希望大家能指出来一起讨论,也希望能看到有更好的想法提供给大家。
本文不会涉及到用何种语言实现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 +
+--------+--------+--------+--------+--------+--------+---------+----------+
在整个封包中,还可以加入更多的元素,比如加密,奇偶校验等,这些要根据实际情况来设计包的结构,这些需要大家在实际的项目中去体会和发现。
本文只是对封包做了一个概要性的讲解,不足、漏洞、不合理肯定是比比皆是。希望大家能指出来一起讨论,也希望能看到有更好的想法提供给大家。
- 实时游戏的网络协议设计.rar (5.9 KB)
- 下载次数: 10
发表评论
-
HttpStatusConfig --一个HTTP 协议返回的 解析说明类
2012-04-18 16:40 0package guwanyuan.qicool.game ... -
HTTP/1.1协议规范(中文归纳版)
2012-04-18 16:39 2013一、介绍(introduction) ... -
[转] [Flash/Flex] 加载SWF性能VS影片剪辑性能
2012-03-15 22:29 0http://bbs.9ria.com/viewthread. ... -
关于富士通windows 7家庭普通板升级为windows 7旗舰版
2012-03-05 14:51 1953windows7普通家庭版不能一下升级到windows7旗舰版 ... -
水果忍者鼠标跟随特效制作[转载]
2012-03-01 16:06 2397实现这效果其实比较简单,主要是思路~! package ... -
请问如何才能让加载到一半的SWF不自动播放
2012-02-29 03:06 1476我用loader加载l=new Loader(); ... -
禁止输入文本可以粘贴
2012-02-10 13:15 2259//禁止输入文本粘贴动作 private static ... -
江湖情缘游戏里的跳的类
2012-02-08 23:55 0package com.app.role.montions ... -
[教程] 路点导航(Waypoint Navigation)
2011-12-31 00:51 0前言:这个不难,所以知道的童鞋不要喷,不知道的童鞋也不要怕,要 ... -
ARPG游戏引擎设计思路
2011-12-31 00:48 00.整体结构 下载 (32.92 KB ... -
Embed绑定XML与txt文本文件
2011-12-28 15:54 4603使用Embed标签可以将图片绑定到swf中并显示,那么我 ... -
Flash_Rich_Text_Editor(完美的富文本编辑器)
2011-12-27 17:55 0Flash_Rich_Text_Editor(完美的富文 ... -
弹弹堂测试
2011-12-08 04:21 0弹弹堂测试弹弹堂测试 -
一些DEMO
2011-11-28 17:42 0一些DEMO一些DEMO -
Matrix学习
2011-11-28 16:51 0Matrix学习 -
[转]三次贝尔曲线
2011-11-10 01:09 1873http://bbs.9ria.com/viewt ... -
[心得] 完美解决as3在ie中初始化时stageWidth和stageHeight为0的问题
2011-11-03 00:46 2887先看下面的一段脚本,这是比较经典的初始化脚本: pa ... -
五子棋算法详解
2011-10-31 04:14 0五子棋算法详解五子棋算法详解五子棋算法详解 -
[转]服务器端ActionScript语言参考
2011-10-31 00:29 0服务器端ActionScript语言参考 -
[转]FLASH与JS序列简单应用
2011-10-28 01:03 2031FLASH与JS序列简单应用 (一) 用swfob ...
相关推荐
类似于SLG这类游戏,对游戏的实时交互要求不是很高,所以一般选择的都是通过HTTP协议,进行前后台数据交互。但随着用户对游戏的需求越来越高,MMORPG也逐步出现在webgame之中,诸如昆仑、乐土这类回合制MMORPG-...
C#本科毕业设计基于Tcp_Ip协议的1v1网络对战游戏源代码.。包括服务端 教程如下: 执行Mysql文件,数据库连接账户名为root,密码为root 开启服务端 开启客户端 使用说明 客户端界面,若连接成功,可使用数据库内已有...
《c#网络编程高级篇之网页游戏辅助程序设计》涉及的领域包括多线程编程技术、socket套接字编程、tcp协议编程、http协议编程、远程控制技术、木马技术、模拟键盘和鼠标技术、网页游戏辅助程序设计技术等。 《c#网络...
网络游戏-基于射频能量收集的无线传感器网络MAC协议设计方法.zip
比较详细的网络课程设计课题一:多人聊天系统的设计与实现:初步掌握基于TCP/IP网络编程的基本实现方法和思路,同时进一步熟悉《计算机网络》课程中基于IP层协议的工作机制。 课题二:文件传输协议的简单设计与实现...
运用tcp协议设计一个五子棋联机对弈程序,采用图形化方式设计。拥有良好的界面,能够完美在VS2012运行
**JAVA泡泡堂网络游戏的设计与实现(源代码+论文)** 本资源提供了一个基于Java语言开发的泡泡堂网络游戏的设计与实现。该游戏是一个经典的多人在线竞技游戏,玩家需要控制角色放置泡泡,通过炸毁泡泡来击败对手或...
按照网络协议规范,需要采用套接字方式,建立基于网络的游戏应用。并且,我们将会提供新建游戏和加入游戏功能;用户登陆后可以创建新游戏或加入已有游戏,通过客户端与其它游戏用户对弈;程序需要采用多线程方式来...
但是,学生对网络的了解大部分是停留在 网上聊天、BBS论坛、网络游戏以及有限的资料收集,没有一个系统了解网络的构成及相 应的软硬件知识,没有形成有意识地利用网络资源帮助学习。因此,在本节内容中要学 生掌握...
网络五子棋本文主要对五子棋网络游戏技术进行研究,以VB为平台设计并实现了一个基于C/S模式的五子棋网络游戏。包括服务器端和客户端,游戏双方一方先运行服务器端,另一方运行客户端,连接到服务器端,双方通过网络...
网络游戏目前在国内相当热门,棋牌类游戏在网络游戏中占有比较...该文总结了一款通用的棋牌类网络游戏服务端的架构设计,介绍了基本架构、通信协议、多线程模型和第3方接I:1的相关内容,并对整个架构作了一定分析。
>>程序源代码 第2.1.3节 RFC的介绍和获取(RFC... 第12.4节 游戏逻辑类(游戏逻辑类代码) 第13章 网络游戏客户端框架 第14.3.3节 访问数据库程序代码(访问数据库类代码)
可扩展的网络通讯协议设计 Mysql3数据库的操作与管理 客户端部分: 实现轻量级的客户端逻辑框架 包含服务层,业务层,视图层 光照渲染原理 Ui自适应原理 摇杆插件制作 Excel表格数据转化为XML配置 基于...
【作者】 傅伟,吴希忠 【来源】JavaThinker.org 本程序是一个基于网络协议为TCP/IP的网上对弈游戏,采用服务器-客户端的网络架构模式,允许网络上的多台机器(可能是两台机器)同时运行,一台用作服务器,始终处理...
给手机用户带来了高达每秒384K的移动带宽,将语音、图像、视频有序地结合起来,给手机用户带来了更加丰富多彩的多媒体娱乐服务,借此东风,各游戏开发商将进入全新的无线网络游戏时代。市场潜力巨大。 手机版象棋...
五子棋游戏设计,具体的说明 ,设计,文档写法等 都有具体的写法
WinSock2 游戏编程 网络游戏开发 101 异步 Sockets 编程指南 ... 如何设计一个多人游戏 多人游戏的本质 制作一套网络消息引擎 使用统计学来预测网络上游戏者的动作 如何排除网络延迟