[转]一个AS3 socket解码设计的错误思路
On 2010年07月17日, in work, by ppzhu
作者:闪刀浪子 http://www.iflashigame.com/ http://hi.baidu.com/mr_ziqiang
转载请保留以上信息。

调试游戏确实是一项磨人的工作。难怪很多业内人都喜欢说“好游戏是改出来的”。奇都(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跳出等待就行了。

很好,我就是这样做的,收一个读一个
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/archive/2010/12/01/1892615.html如需转载请自行联系原作者

jiahuafu

一个AS3 socket解码设计的错误思路相关推荐

  1. 自己做一个短链服务,设计思路分享!

    其实实现短链服务并不是很难,最主要还是需要知道一些设计思路,还需要有一些基础技术知识,例如:哈希算法.全局发号器等. 下面一起来学习如何设计一个短链服务吧! 短链的价值 网址大家都知道,很长的一串字符 ...

  2. AS3 Socket 基础知识(很全面)

    在讲AS3 Socket之前我们先来搞清几个概念,这有助于我们更加了解网络通信! 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标 ...

  3. 面试必备:一个秒杀系统的设计思考

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:阿哲 segmentfault.com/a/11900000 ...

  4. 一个秒杀系统的设计思考

    简介:从架构视角来看,秒杀系统本质是一个高性能.高一致.高可用的三高系统.而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题. 秒杀大家都不陌生.自2011年首次出现以来,无论是双 ...

  5. (转)AS3 Socket

    在讲AS3 Socket之前我们先来搞清几个概念,这有助于我们更加了解网络通信! 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标 ...

  6. 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记

    对Verilog 初学者比较有用的整理(转自它处) 作者: Ian11122840 时间: 2010-9-27 09:04 标题: 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记 所谓综 ...

  7. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误. 下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法. 看 ...

  8. 经验:一个秒杀系统的设计思考

    点击上方「蓝字」关注我们 前言 秒杀大家都不陌生.自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见.简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的 ...

  9. 一个秒杀系统的设计思考(整体思考,收藏了)

    作者:阿哲 来源:https://segmentfault.com/a/1190000020970562 前言 秒杀大家都不陌生.自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀 ...

最新文章

  1. 最有效阻止SSH暴力破解的方法
  2. 基于 Module 的 Laravel API 架构
  3. IPM: Six right dimensions limitation
  4. mysql 外键约束_MySQL之外键约束(FOREIGN KEY)
  5. hive sql 怎么实现循环_shell中循环调用hive sql 脚本的方法
  6. javascript高逼格代码实现数组去重,JSON深度拷贝,匿名函数自执行,数字取整等...
  7. houseprice_analysis_广州房子租售比分析(中)
  8. hls视频demo搭建简易服务器模拟运行
  9. 11年电赛综合测评——单运放三角波发生器
  10. My Fifty-First Page - 组合总和 - By Nicolas
  11. 私域流量经济时代,商家如何打造属于你的店铺品牌私域流量池?
  12. 2022电大国家开放大学网上形考任务-市场营销学非免费(非答案)
  13. redis incr mysql_redis命令_INCR
  14. 100个数据分析常用指标和术语
  15. 培训:3天带你快速上手Kubernetes | 上海站
  16. 【半导体先进工艺制程技术系列】FinFET和UTB-SOI简介
  17. java.sql.SQLException: Zero date value prohibited
  18. go 图片转base64
  19. oracle exp nls lang,Oracle中exp的使用2
  20. Windows(Wox) 办公提效工具

热门文章

  1. SimplePing的使用
  2. 中国刑事警察学院计算机中心,中国刑事警察学院计算机犯罪侦查系
  3. python扫雷游戏代码_python实现扫雷游戏的示例
  4. ​干货!影视剪辑大神常用避免侵权的8个秘籍首次公开【覃小龙课堂】
  5. Shell中语句if -z至-d含义
  6. 基于autojs的安卓免root脚本引擎编写的QQ文字换语言发送全自动脚本
  7. 雷宁轮播图 编辑html,零基础学html+css
  8. 电脑常识:中文模式和英文模式下的符号有何区别?有何应用?
  9. 甲骨文的医疗版图:临床大数据提升中国药企竞争力
  10. Cesium实战记录(五)天际线分析