一个AS3 socket解码设计的错误思路

调试游戏确实是一项磨人的工作。难怪很多业内人都喜欢说“好游戏是改出来的”。奇都(game.qdooo.com)基础平台目前还在测试,陆陆 续续收到了很多朋友的反馈(想参与测试的朋友欢迎联系我索取激活码)。所以这段时间的主要工作是在做美化和优化,新的竞技系统也在紧锣密鼓的准备中。

  这里主要想说一下socket解码在设计时忽略的一个问题。(感谢Lite3的反馈)。

  对于客户端的Socket的数据基本读取方式一般来说可以分为三种:

1、按照数据流的结尾标记截取
2、按照包头记录的包长度截取
3、按照包长度截取并验证结尾标记。

第一种方式:如图,通常做发是每个包结尾发送一个\0标记,表示这个数据包发送完了。socket每次读取1个字节直到遇到结尾符,结束读取将数据包传递到逻辑层。这种方式在xmlSocket时就已经用了很多了。

第二种方式:如图包头用一个整型记录完整包的长度。每次都先读取一个包长度,然后按照包长度读取指定长度的数据作为一个完整数据包传递到到逻辑层。

第三种方式:如图。这种方式把以上两种方式做了结合,读取的时候无需一个一个字节读,直接读取指定长度。结尾符可以用来做校验判定,同时可以作为包长度字节的读取依据。(如果上一个包有问题可以丢弃之后,以结尾符为标记读取下一个包的包长度。)

  介绍了一点基本原理,下面说一下这个设计缺陷。

问题:

  通讯中我们使用的是第二种方式——包长读取。在通讯类中创建一个临时存储变量_dataArray,提供一个getData():*公用方法,供外部取出数据。每次读完一个完整包后压入_dataArray,同时触发"recievedData"事件。代码如下:

private function socketDataHandler(event:ProgressEvent):void
{
//_readFlag:int;//0表示全部读完了,1表示长度读取完毕 2表示正在读取数据
while (bytesAvailable)
{
     if (_readFlag == 0&&bytesAvailable>=4)
{
       _length = Number(readInt());
       _readFlag=1
}
   if (_readFlag == 1 && bytesAvailable >= _length)
{
      var temp:Object = readObject();
     _dataArray.push(temp);
     dispatchEvent(new Event("recievedData"));//
     _length = 0;
     _readFlag = 0;
}
}
}

  以上代码从结构上看是没有任何问题的,而且在测试前期我们也一直用着没有任何问题。逻辑相当清楚:接收到socket的事件后首先读取一个包长,然后按照包长读取数据。读取完毕发出事件。。。

  那么,问题终于来了——网友Lite3出现了。^ _ ^

  Lite3发来了一个出错提示:
          Error: Error #1502: 脚本的执行时间已经超过了 15 秒的默认超时设置。
          at qdooo.net::mySocket/socketDataHandler()

  相信大家一看就能知道问题出在了哪里——问题就在while上。

       while的循环等待时间因为某种原因超过了15秒。这里所指的某种原因就是网速,那天Lite3那边的网速非常慢。这样一来放大了设计中一处缺陷所照成的影响——必须等到可读数据的长度等于或者大于包长度的时候才开始读取,也就是下面这句:

if (_readFlag == 1 && bytesAvailable >= _length)

正是由于这个判断做了限定,如果数据长度不够,那么他会在while中一直循环等待。直到超过15秒报错。

解决:

  分析好了原因那么就很好解决了,想办法读空流里面的数据让while跳出等待就行了。

时间: 2024-10-27 14:47:41

一个AS3 socket解码设计的错误思路的相关文章

c#-C#做一个益智类游戏 设计思路

问题描述 C#做一个益智类游戏 设计思路 新手,老师留了一个课题用C#做一个搭桥的益智类游戏,游戏的链接:http://www.puzzle-bridges.com/ 求大神给个思路,具体怎么设计这个游戏 解决方案 遍历所有节点,按照规则判断.岛和岛只能水平垂直连接,每个岛的桥的数量和数字相等,桥不能交叉生成游戏可以随机先产生节点和网格,随机删除一些路径,然后标记好数字,画出来.

求一个激活码的设计思路

问题描述 求一个激活码的设计思路 项目过程中有这么一个需求,要求设计一个激活码功能 用来激活某一个功能,比如:激活之后可以做删除操作,没激活则使用不了. 解决方案 可以使用本地验证和网络验证两种方式..

一个显示效果非常不错的PHP错误、异常处理类

 这篇文章主要介绍了一个显示效果非常不错的PHP错误.异常处理类,代码思路清晰,功能强大,需要的朋友可以参考下 一.效果图:         二.实现代码    代码如下:<?php   // 自定义异常函数 set_exception_handler('handle_exception');   // 自定义错误函数 set_error_handler('handle_error');   /**  * 异常处理  *  * @param mixed $exception 异常对象  * @a

c# 2.0-C#用Socket异步时出现错误

问题描述 C#用Socket异步时出现错误 各位大侠: 我刚用 C# 写Socket 代码,服务器端用异步监控客户端,代码如下 //开启服务器端监控---Begin internal void MonitorClient() { IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 端口号); Socket serverSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolT

c语言-请教一个关于socket的问题

问题描述 请教一个关于socket的问题 代码中有这样一段 if ((m_UDPSndrSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { AfxMessageBox("Failed to create UDPSocket"); return FALSE; } 然后出现了这样的错误 error C2065: 'WSASocket'

php与flash as3 socket通信传送文件实现代码_php技巧

前段时间在flashseer看到有人提到:可以通过socket方式传送swf文件,让用户无法获取到swf文件- 当时还没有出as3的反编译,所以对程序的保护没有在意.随着反编译程序的平民化,不希望别人看到源代码的朋友就比较着急- 通过socket方式传送swf文件来避免泄漏源代码的思路(只适用as3): 让主程序的loader(前台swf)通过socket连接到后台程序,然后请求需要的主程序文件.后台读取主程序数据通过socket发送给主程序的 loader.前台swf适用Loader.load

一个缺陷管理系统数据库设计和界面设计分析

在Winform方面,基于业务的不同,我们可以利用工具的效率,快速做很多不同的业务系统,前期做了一个缺陷管理系统,想把单位的测试业务规范下,也好统计和分析每个版本的缺陷信息,本篇整理这些数据库设计和界面设计的相关内容,做一个介绍,希望给大家一个对比参照的案例进行学习了解. 1.缺陷管理系统的业务分析 在很多缺陷管理系统里面,我们往往需要管理的就是缺陷信息的记录,以及缺陷记录的开闭过程,从而实现了测试人员->开发人员->测试人员的整个闭环过程. 一般情况下,缺陷管理系统可以部署在局域网内,或者公

怎样开始一个ASP网站的设计

设计 怎样开始一个ASP网站的设计 把这篇文章送给bluetooth:也作为给初学者的一个参考.文中谈到的只是我的个人看法和做法,如有不尽之处,请指正. 在开始设计一个ASP站点的时候,面对着一大堆的问题,到底要怎么样入手,才能让网站设计做到快,好,而且调试.更改,移植起来又方便呢?下面以留言本的设计为例子,谈谈站点的设计. (一)站点的功能 "磨刀不误砍柴工",先写出站点的功能,对以后的工作有很大的帮助.现在来设计一个留言本,功能如下: 1.单用户版.只有一个管理员,所有人都可以留言

一个大学生的网页设计生涯

设计|网页|网页设计 "从农村到城市,家里唯一期望就是我,所以我感觉自己压力很大."     他困惑,自己看到的和书上的不一样,感觉自己很无助,很迷失,没有方向感:他狂喜,年收入6万元.     "在虚拟的网络中,特别是在自己的网站论坛中你随时可以找到家的感觉,那么多人都给你祝福,温情,赞美."     近在咫尺的成功是现实还是梦境,一个大学生的网页设计生涯. 第一步:第一个个人主页     赵凯出生在河北省保定一个普通的农村家庭,2001年,他以一个并不优异的成绩