`
hgfghe4
  • 浏览: 61580 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个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跳出等待就行了。
本文转自:http://www.5uflash.com/flashjiaocheng/Flash-as3-jiaocheng/5192.html
分享到:
评论

相关推荐

    FLASH AS3 SOCKET收发16进制示例

    `HEXtoString as3.as`这个文件可能包含一个函数,用于将16进制字符串转换为ByteArray,以便于Socket通信。 在AS3中,使用Socket类的步骤如下: 1. **创建Socket实例**:首先,你需要创建一个Socket对象,例如`var ...

    H264 Socket解码

    H264 Socket解码是一个复杂的过程,涉及到网络传输、数据处理、视频编码等多个领域。针对描述中的问题,我们需要从数据完整性的保证、NAL单元的处理、关键参数的解析等方面入手,通过细致的分析和调试,找到并解决...

    as3_Socket_的简单实例

    AS3中的`Socket`类是Flash Player 9引入的新特性,用于创建基于TCP/IP协议的网络连接。Socket连接允许应用程序直接与远程服务器进行低级别的数据通信,而不依赖于特定的应用层协议,如HTTP或HTTPS。这种直接的连接...

    flash as3.0 socket编程

    host 参数可以是一个域名或 IP 地址,而 port 参数是一个整数值,表示 Socket 服务器监听的端口号。 在连接 Socket 服务器时,我们需要确定两个信息:Socket 服务器的域名或 IP 地址,和服务器监听的端口号。无论...

    as3_socket

    本文将详细介绍AS3中的Socket编程基础,并通过具体的示例来解释如何实现与Socket服务器的连接、数据交换以及错误处理等关键步骤。 #### 二、基础知识 在开始深入探讨之前,我们需要了解一些基本概念: - **Socket**...

    flash actionscript3游戏开发之as3的socket通信方式介绍即使用XMLSocket.zip

    本文将深入探讨AS3中的Socket通信方式,特别是利用XMLSocket进行网络交互的细节。 首先,XMLSocket是AS3中用于低级网络通信的类,它提供了双向、全双工的数据流,适合于游戏开发中的实时数据交换,如玩家状态同步、...

    MFC+ffmpeg+socket实时解码H.264码流

    在IT领域,尤其是在多媒体处理和网络通信中,"MFC+ffmpeg+socket实时解码H.264码流"是一个关键的技术组合。这个技术栈主要用于实现远程视频传输和播放,尤其是在实时监控、在线视频会议或者流媒体服务中。下面将详细...

    AS3使用Socket的简单例子.txt

    在AS3中,使用`XMLSocket`类创建一个Socket对象并配置其属性是非常简单的。下面的代码展示了如何创建一个`XMLSocket`实例,并指定服务器的IP地址和端口号: ```actionscript private var __xmlSocket:XMLSocket; ...

    Linux网络编程socket错误码分析

    Linux 网络编程 socket 错误码分析 在 Linux 网络编程中,socket 函数可能会返回多种错误码,这些错误码提供了有价值的信息,可以帮助开发者诊断和处理网络编程中的问题。本文档总结了常见的 socket 错误码及其处理...

    as3-java socket

    本文将深入探讨“as3-java socket”这个主题,这是关于使用ActionScript 3(AS3)与Java进行Socket通信的一个测试程序。AS3是Adobe Flash Platform的主要编程语言,而Java Socket API则是用于实现网络上的双向通信的...

    一段as3.0与c++socket通信的例子(as端代码)

    首先,我们需要创建一个`Socket`对象实例,通过调用其构造函数指定服务器的IP地址和端口号。例如: ```as3 var socket:Socket = new Socket(); socket.connect("服务器IP", "服务器端口"); ``` 2. **事件处理...

    as3与java简单socket交互demo

    1. **初始化Socket对象**:首先,我们需要创建一个Socket对象,指定服务器的IP地址和端口号,如`var socket:Socket = new Socket(); socket.connect("服务器IP", "端口号");`。 2. **事件监听**:为了接收和发送...

    java和as3 socket通信 解决安全沙箱问题

    在Java中,我们可以使用`java.net.ServerSocket`和`java.net.Socket`类来创建一个监听特定端口的服务端,等待AS3客户端的连接。一旦连接建立,我们可以通过`Socket`对象的输入和输出流进行双向通信。 4. **AS3 ...

    (AS3)socket+客户端与服务端+实例

    描述中的"flash使用socket通讯的一个挺好的例子哦"意味着我们有一个实际的AS3 Socket通信案例,这个案例可能包含了客户端和服务器端的代码示例,可以帮助我们更好地理解如何实现通信流程。 在标签"客户端与服务端...

    flashas3.0socket编程

    资源名称:flash as3.0 socket编程 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    flash as3 socket编程基础

    本文将详细介绍如何在ActionScript 3.0 (AS3)环境中使用Socket进行编程,并通过具体的示例来帮助读者更好地理解和掌握这一技术。 #### 二、Socket编程概述 Socket是一种在网络中建立两台计算机之间通信连接的方式...

    android Socket通信方法与思路

    Socket,又称为套接字,是网络编程中的一个抽象概念,用于描述IP地址和端口号的组合,是应用层与传输层的接口。在Android中,我们可以使用Java的Socket类和ServerSocket类进行网络通信。 1. **创建ServerSocket**:...

    AS3 SOCKET

    AS3中的SOCKET技术是ActionScript 3.0中用于实现网络通信的一种方式,它允许客户端(通常是Flash应用程序)与服务器之间进行低级的、基于TCP/IP协议的双向数据传输。在AS3中,有两种主要的类用于实现SOCKET通信:...

Global site tag (gtag.js) - Google Analytics