Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3:隐藏已加载的资源_Flash_Actionscript 3 - Fatal编程技术网

Flash AS3:隐藏已加载的资源

Flash AS3:隐藏已加载的资源,flash,actionscript-3,Flash,Actionscript 3,这是一个分为两部分的问题。我正在构建一个flash图像查看器,作为一个便携式年龄限制模块(暴力视频游戏)。基本上,它将从CDN加载任意数量的图像,并要求用户在查看之前输入他们的生日。简单的东西。问题是,根据公司政策,我们不能允许通过任何嗅探方式直接访问这些图像(例如,在Webkit/Firebug中查看您的资源/Net选项卡,或者如果我们以这种方式加载它们,则查看XHR)。所以,我想听听你对解决这个问题的最佳方法的看法 起初,我认为应该有一个服务器端脚本,通过传递一个可以解密但带有动态salt的

这是一个分为两部分的问题。我正在构建一个flash图像查看器,作为一个便携式年龄限制模块(暴力视频游戏)。基本上,它将从CDN加载任意数量的图像,并要求用户在查看之前输入他们的生日。简单的东西。问题是,根据公司政策,我们不能允许通过任何嗅探方式直接访问这些图像(例如,在Webkit/Firebug中查看您的资源/Net选项卡,或者如果我们以这种方式加载它们,则查看XHR)。所以,我想听听你对解决这个问题的最佳方法的看法

起初,我认为应该有一个服务器端脚本,通过传递一个可以解密但带有动态salt的var来加载图像(例如通过PHP),例如,使用一个不太可能被发现的方法(例如,将salt嵌入整个字符串),但这违背了CDN的目的,因为所有请求都将被地理定位到服务器

然后我认为通过套接字加载图像将是一个好的解决方案,但是,我在将二进制图像(在删除响应头之后)转换为位图时遇到了问题

有没有更好的办法?我知道现实中不可能完全阻止内容被链接到(例如有人可以截屏flash),但我的目标只是采取措施防止这种情况发生。如有任何想法,将不胜感激。下面是套接字代码(删除了不相关的部分),如果有帮助的话

package com.std.socket {
    import flash.system.Security;
    import flash.net.Socket;
    import flash.events.*;
    import flash.errors.*;
    import flash.display.Bitmap;
    import flash.display.MovieClip;
    import flash.display.Loader;
    import flash.utils.ByteArray;

    public class SocketRequest {
        private var root:MovieClip;
        private var sock:Socket;
        private var data:ByteArray = new ByteArray();
        private var request:Object = {
            'host': null,
            'port': null,
            'uri': null,
            'callback': null,
            'response_parts': [] };

        public function SocketRequest(root:MovieClip, host:String, port:int, uri:String, callback:Function):void {
            Security.allowDomain('*');
            Security.loadPolicyFile('http://foo.bar/crossdomain.xml');

            this.request.root = root;
            this.request.host = host;
            this.request.port = port;
            this.request.uri = uri;

            this.sock = new Socket();
            this.sock.addEventListener(Event.CONNECT, this.evt_socketConnect);
            this.sock.addEventListener(Event.CLOSE, this.evt_socketClose);
            this.sock.addEventListener(ProgressEvent.SOCKET_DATA, this.evt_socketResponse);
            this.sock.connect(this.request.host, this.request.port);
        }

        private function evt_socketConnect(evt:Event):void {
            // Send the request headers
            this.sock.writeUTFBytes('GET ' + this.request.uri + " HTTP/1.1\n");
            this.sock.writeUTFBytes('Host: ' + this.request.host + ':' + this.request.port + "\n\n");
        }

        private function evt_socketClose(evt:Event):void {
            // Since this is an image, just split on header \r\n and get the last member 
            var response:Array = this.request.response_parts.join('').split("\r\n");
            var body:String = response[response.length - 1];
            var loader = new Loader();
            var ba:ByteArray = new ByteArray();
            var mc:MovieClip = new MovieClip();

            this.data.writeMultiByte(body, 'utf-8');

            loader.loadBytes(this.data);
            mc.addChild(loader);

            // Pass the resulting MovieClip back to the caller
            if(typeof(this.request.callback) == 'function')
                this.request.callback.apply(this.request.root, [mc])
        }

        private function evt_socketResponse(evt:ProgressEvent):void {
            if(!this.sock.bytesAvailable)
                return;
            this.request.response_parts.push(this.sock.readUTFBytes(this.sock.bytesAvailable));
        }
    }
}
在我写作的过程中,我认为在
SocketRequest::evt_socketResponse()
中,
this.sock.readUTFBytes()
位应该是:

this.request.response_parts.push(this.sock.readBytes(this.data, this.data.length, evt.bytesLoaded));

然后从
这个.data
中删除标题,但是我不是超级精通ByteArray的人。有人有什么想法吗?

您的代码有几处看起来不对劲

首先,您使用的是读/写字节。这对于二进制数据来说是行不通的。您需要读/写字节

其次,标头由
\r\n\r\n
序列终止,而不是
\r\n

我会这样做:

private function evt_socketClose(evt:Event):void {

    _buffer.position = 0;
    var pos:int = 0;

    while(_buffer.bytesAvailable >= 4) {

        if(_buffer.readUnsignedByte() == 0xd && _buffer.readUnsignedByte() == 0xa
            && _buffer.readUnsignedByte() == 0xd && _buffer.readUnsignedByte() == 0xa) {

            var bodyBytes:ByteArray = new ByteArray();
            bodyBytes.writeBytes(_buffer,_buffer.position);
            var loader:Loader = new Loader();
            var mc:MovieClip = new MovieClip();
            loader.loadBytes(bodyBytes);
            mc.addChild(loader); 
            if(this.request.callback is Function) {
                this.request.callback.apply(this.request.root, [mc]);
            }
            // this return isn't really neccesary...
            return;
        }
    }

}

private var _buffer:ByteArray = new ByteArray();

private function evt_socketResponse(evt:ProgressEvent):void {
    if(!this.sock.bytesAvailable) {
        return;
    }
    var bytesToRead:uint = this.sock.bytesAvailable;
    this.sock.readBytes(_buffer,_buffer.position,bytesToRead);
    _buffer.position += bytesToRead;
}

基本上,当您接收数据时,您将其存储在缓冲区中。数据完成后,开始读取此缓冲区,直到找到标头的结尾(
\r\n\r\n
0xd,0xa,0xd,0xa
)。此时,缓冲区位置是正文/有效负载的第一个字节。因此,您从该点一直读取缓冲区,并将其存储在ByteArray中。然后将这个ByteArray传递给
Loader::loadBytes
,如果您加载的是有效的图像或swf,那么应该加载它。

现在越来越清晰了。这些修复非常有效。我感谢你的帮助@姆韦。没问题。我很高兴这有帮助。