如何使用 AS3 从 Web 服务器加载二进制数据?

Posted

技术标签:

【中文标题】如何使用 AS3 从 Web 服务器加载二进制数据?【英文标题】:How to use AS3 to load binary data from web server? 【发布时间】:2011-12-10 14:26:26 【问题描述】:

我正在尝试像这样从服务器加载一些二进制数据

var urlRequest:URLRequest = new URLRequest("http://localhost/test.php");
var loader:Loader = new Loader();

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);   
loader.load(urlRequest);

但是总是报错:

Loader Error #2124: Loaded file is an unknown type

我的二进制数据是自定义数据,但不是 swf/图像文件。 flash不支持加载此类数据吗?还是我应该使用其他方法?

【问题讨论】:

我已经得到了答案,应该使用 URLLoader 而不是 Loader。 由于您引用了二进制数据,您可能需要考虑使用套接字来处理二进制数据。很高兴您解决了 URLLoader 问题。 【参考方案1】:

您是否考虑过实现套接字?这将使您更好地控制特定数据类型的二进制序列化。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html

从 Adob​​e 文档中引用的代码示例:

package 
    import flash.display.Sprite;

    public class SocketExample extends Sprite 
        private var socket:CustomSocket;

        public function SocketExample() 
            socket = new CustomSocket("localhost", 80);
        
    


import flash.errors.*;
import flash.events.*;
import flash.net.Socket;

class CustomSocket extends Socket 
    private var response:String;

    public function CustomSocket(host:String = null, port:uint = 0) 
        super();
        configureListeners();
        if (host && port)  
            super.connect(host, port);
        
    

    private function configureListeners():void 
        addEventListener(Event.CLOSE, closeHandler);
        addEventListener(Event.CONNECT, connectHandler);
        addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
    

    private function writeln(str:String):void 
        str += "\n";
        try 
            writeUTFBytes(str);
        
        catch(e:IOError) 
            trace(e);
        
    

    private function sendRequest():void 
        trace("sendRequest");
        response = "";
        writeln("GET /");
        flush();
    

    private function readResponse():void 
        var str:String = readUTFBytes(bytesAvailable);
        response += str;
    

    private function closeHandler(event:Event):void 
        trace("closeHandler: " + event);
        trace(response.toString());
    

    private function connectHandler(event:Event):void 
        trace("connectHandler: " + event);
        sendRequest();
    

    private function ioErrorHandler(event:IOErrorEvent):void 
        trace("ioErrorHandler: " + event);
    

    private function securityErrorHandler(event:SecurityErrorEvent):void 
        trace("securityErrorHandler: " + event);
    

    private function socketDataHandler(event:ProgressEvent):void 
        trace("socketDataHandler: " + event);
        readResponse();
    

【讨论】:

我们之所以使用http,只是想释放socket服务器的繁重负载。还是谢谢!【参考方案2】:

当我必须将二进制数据(图像)从我的服务器端 (PHP) 发送到 Flash (Flex) 时,我通常将数据编码为 64 位(Base64 编码器),然后使用 Base64Decoder 在 Flex 中*解码*编码班级。希望对您有所帮助。

【讨论】:

【参考方案3】:

您需要使用URLLoader 而不是Loader。因为

Loader 对象仅用于加载 swf 和图像。和

URLLoader 仅用于存储二进制数据或文本或二进制编码数据。

【讨论】:

【参考方案4】:

需要使用URLLoader并指定请求的dataFormat:

var request:URLRequest = new URLRequest(url);
var urlLoader:URLLoader = new URLLoader(request);
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, onLoaded);


function onLoaded(e:Event):void 
  var bytes:ByteArray = urlLoader.data;

【讨论】:

以上是关于如何使用 AS3 从 Web 服务器加载二进制数据?的主要内容,如果未能解决你的问题,请参考以下文章

as3 从网络外部加载 swf 以控制从网络外部加载的 swf

从 as3 中的 POST 上传中获取 ProgressEvent

AS3 如何将数据从对象提取到剪贴板、rest、db、文件等?

如何访问 IOErrorEvent 上的 AS3 URLLoader 返回数据

如何使用 Flash (AS3) 从远程域调用 Flex SWF?

AS3 将多个文本框数据保存并加载到本地文件