Как использовать AS3 для загрузки двоичных данных с веб-сервера?

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

Я пытаюсь загрузить некоторые двоичные данные с сервера следующим образом

 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 не поддерживает загрузку таких данных? Или я должен использовать какой-то другой метод?

Комментарии:

1. Я уже получил ответ, следует использовать URLLoader вместо Loader.

2. Поскольку вы указали двоичные данные, вы можете рассмотреть сокеты для обработки двоичных данных. Рад, что вы решили проблему с загрузчиком URL.

Ответ №1:

Вам нужно использовать URLLoader и указать формат данных запроса:

 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;
}
  

Ответ №2:

Вы думали о реализации сокетов? Это даст вам больший контроль над двоичной сериализацией определенных типов данных.

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

Пример кода, приведенный в документации Adobe:

 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 amp;amp; 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();
    }
}
  

Комментарии:

1. Причина, по которой мы используем http, заключается в том, что мы просто хотим снять большую нагрузку с сервера сокетов. Все равно спасибо!

Ответ №3:

Вам нужно использовать URLLoader вместо Loader . Потому что

Loader объект полезен только для загрузки swfs и изображений. и

URLLoader только для хранения двоичных данных или текстовых или двоичных данных.

Ответ №4:

Когда мне нужно отправить двоичные данные (изображения) с моего сервера (PHP) на Flash (Flex) Обычно я кодирую данные в 64-битном формате (кодировщик Base64), а затем я * де * кодирую их в Flex, используя класс Base64Decoder . Надеюсь, это вам поможет.