zoukankan      html  css  js  c++  java
  • AS3 CookBook学习整理(十七)

    1. 下载文件

    使用flash.net.FileReference对象的download(urlRequest, aliasName)方法

    download()方法最好在try...catch语句中执行,因为该方法可能会抛出异常

    package {
     import flash.display.Sprite;
     import flash.errors.IllegalOperationError;
     import flash.errors.MemoryError;
     import flash.events.IOErrorEvent;
     import flash.events.MouseEvent;
     import flash.events.SecurityErrorEvent;
     import flash.net.FileReference;
     import flash.net.URLRequest;
     public class Sample0723 extends Sprite
     {
      public function Sample0723()
      {
       stage.addEventListener(MouseEvent.CLICK,onClick);
      }
      
      private function onClick(event:MouseEvent):void
      {
       var urlRequest:URLRequest = new URLRequest("http://xyq.gdl.netease.com/08cg.rar");
       var fileRefer:FileReference = new FileReference();
       fileRefer.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
       fileRefer.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
       
       try
       {
        fileRefer.download(urlRequest,"patch.jpg");
       }
       catch(illegalOperation:IllegalOperationError)
       {
        //当保存对话框已经打开的情况下调用download()方法 
       }
       catch(security:SecurityError)
       {
        //Swf不允许下载 
       }
       catch(argument:ArgumentError)
       {
        //URLRequest的data属性的值不是URLVariables 
       }
       catch(memory:MemoryError)
       {
        //有两种可能会导致此异常:
     
        //1.当URLRequest设置为GET请求而且System.useCodePage为true,Flash播放器将 
        //不能把Unicode转换到字节字符格式
     
        //2.Flash播放器没有足够的内存打开保存对话框 
       }
      }
      
      private function onSecurityError(event:SecurityErrorEvent):void
      {
       trace("SecurityErrorEvent");
      }
      
      private function onIOError(event:IOErrorEvent):void
      {
       trace("IOErrorEvent");
      }
     }
    }

    2. 监测用户是否确认(或取消)了下载文件

    download()方法本身没有暂停执行功能,一旦download()方法被调用,Flash播放器就会试图打开保存对话框,要么成功打开对话框,要么抛出异常,而Flash播放器则继续执行下一行代码,也就是系统并不知道用户是否已经选择了文件并点击保存按钮

    解决方法是监听Event.SELECT事件和Event.CANCEL事件,在事件中可以获得被下载文件的名称,因为其事件发起者就是FileReference

    package {
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.MouseEvent;
     import flash.net.FileReference;
     import flash.net.URLRequest;
     public class Sample0723 extends Sprite
     {
      private var fileRefer:FileReference;
      
      public function Sample0723()
      {
       stage.addEventListener(MouseEvent.CLICK,onClick);
       fileRefer = new FileReference();
       fileRefer.addEventListener(Event.SELECT,onSelect);
       fileRefer.addEventListener(Event.CANCEL,onCancel);
      }
      
      private function onClick(event:MouseEvent):void
      {
       var urlRequest:URLRequest = new URLRequest("http://xyq.gdl.netease.com/08cg.rar");
       try
       {
        fileRefer.download(urlRequest,"patch.jpg");
       }
       catch(error:Error)
       {
        trace(error.message);
       }
      }
      
      private function onSelect(event:Event):void
      {
       trace("用户点了确定,下载文件为"+(event.target  as  FileReference).name);
      }
      
      private function onCancel(event:Event):void
      {
       trace("用户取消了下载");
      }
     }
    }

    3. 监视文件下载进度

    下载过程中会不断触发ProgressEvent.PROGRESS事件,下载完成后,会触发Event.COMPLETE事件

    PS: 需要把FileReference对象声明为类变量才能正常触发ProgressEvent.PROGRESS事件

    package {
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.MouseEvent;
     import flash.events.ProgressEvent;
     import flash.net.FileReference;
     import flash.net.URLRequest;
     import flash.text.TextField;
     import flash.text.TextFieldAutoSize;
     public class Sample0724 extends Sprite
     {
      private var label:TextField;
      private var fileRefer:FileReference;
      
      public function Sample0724()
      {
       label = new TextField();
       label.text = "text";
       label.autoSize = TextFieldAutoSize.CENTER;
       this.addChild(label);
       stage.addEventListener(MouseEvent.CLICK,onClick);
       
       fileRefer = new FileReference();
       fileRefer.addEventListener(ProgressEvent.PROGRESS,onProgress);
       fileRefer.addEventListener(Event.COMPLETE,onComplete);
      }
      
      private function onClick(event:MouseEvent):void
      {
       fileRefer.download(new URLRequest("http://xyq.gdl.netease.com/08cg.rar"));
      }
      
      private function onProgress(event:ProgressEvent):void
      {
       label.text = event.bytesLoaded + "/" + event.bytesTotal;
      }
      
      private function onComplete(event:Event):void
      {
       label.text = "download complete!";
      }
     }
    }

    4. 浏览本地文件

    使用FileReference或FileReferenceList对象的browse()方法可以打开一个对话框用户选择本地磁盘文件,区别在于FileReference对象的browse()方法只能选择一个文件,而FileReferenceList对象可以选择多个文件

    package {
     import flash.display.Sprite;
     import flash.errors.IllegalOperationError;
     import flash.net.FileReferenceList;
     public class Sample0724 extends Sprite
     {
      public function Sample0724()
      {
       var fileReferList:FileReferenceList = new FileReferenceList();
       try
       {
        fileReferList.browse();
       }
       catch(illegalOperation:IllegalOperationError)
       {
        //导致illegal operation error异常可能有两种可能 
        //1. 在打开一个浏览对话框后,如果再次调用browse(),就会抛出IllegalOperationError 
        //2. 用户对全局Flash播放器设置为不允许文件浏览 
       }
      }
     }
    }

    5. 文件浏览对话框只显示特定类型的文件

    传递一个FileFilter对象数组作为browse()方法的参数,例如:

    var fileFilter2:FileFilter = new FileFilter("文本文件(*.txt)","*.txt");

    第一个参数决定显示的名称

    第二个参数指定生效的文件扩展名

    文件过滤器同时适用于FileReference与FileReferenceList对象

    PS: 在设置过滤器后,调用browse()方法可能会抛出ArgumentError异常,这是由于FileFilter对象的格式错误造成的

    package {
     import flash.display.Sprite;
     import flash.errors.IllegalOperationError;
     import flash.net.FileFilter;
     import flash.net.FileReferenceList;
     public class Sample0724 extends Sprite
     {
      public function Sample0724()
      {
       var fileFilter0:FileFilter = new FileFilter("所有文件(*.*)","*.*");
       var fileFilter1:FileFilter = new FileFilter("图像文件(*.jpg;*.gif;*.png)","*.jpg;*.gif;*.png");
       var fileFilter2:FileFilter = new FileFilter("文本文件(*.txt)","*.txt");
       
       var fileReferList:FileReferenceList = new FileReferenceList();
       fileReferList.browse([fileFilter0,fileFilter1,fileFilter2]);
      }
     }
    }

    6. 监测用户是否选择(或取消)了文件对话框里的文件

    监听Event.SELECT事件和Event.CANCEL事件,在事件中可以获得被下载文件的名称(name)和大小(size)。对于FileReferenceList也有效,此时会得到一个fileList的数组,数组里的每一项为一个文件的具体信息

    package {
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.net.FileReferenceList;
     public class Sample0724 extends Sprite
     {
      private var fileReferList:FileReferenceList;
      
      public function Sample0724()
      {
       fileReferList = new FileReferenceList();
       fileReferList.addEventListener(Event.SELECT,onSelect);
       fileReferList.addEventListener(Event.CANCEL,onCancel);
       fileReferList.browse();
      }
      
      private function onSelect(event:Event):void
      {
       var fileList:Array = (event.target  as  FileReferenceList).fileList;
       for(var str:String  in  fileList)
       {
        trace(fileList[str].name+","+fileList[str].size);
       }
      }
      
      private function onCancel(event:Event):void
      {
       trace("用户取消了操作");
      }
     }
    }

    7. 上传文件

    使用FileReference对象的upload()方法,并结合服务器端脚本

    服务器端代码(.net)

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.Request.Files.Count > 0)
        {
            string tempFile = Request.PhysicalApplicationPath;
            for (int j = 0; j < Request.Files.Count; j++)
            {
                HttpPostedFile uploadFile = Request.Files[j];
                if (uploadFile.ContentLength > 0)
                {
                    uploadFile.SaveAs(tempFile + "\\" + uploadFile.FileName);
                }
            }
        }
        HttpContext.Current.Response.Write(" "); 
    }

    AS3代码:

    package {
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.ProgressEvent;
     import flash.net.FileReference;
     import flash.net.URLRequest;
     import flash.text.TextField;
     import flash.text.TextFieldAutoSize;
     public class Sample0727 extends Sprite
     {
      private var fileRefer:FileReference;
      private var label:TextField;
      
      public function Sample0727()
      {
       label = new TextField();
       label.autoSize = TextFieldAutoSize.CENTER;
       this.addChild(label);
       
       fileRefer = new FileReference();
       fileRefer.addEventListener(ProgressEvent.PROGRESS,onProgress);
       fileRefer.addEventListener(Event.SELECT,onSelect);
       fileRefer.browse();
       
      }
      
      private function onProgress(event:ProgressEvent):void
      {
       label.text = event.bytesLoaded + "/" + event.bytesTotal;
      }
      
      private function onSelect(event:Event):void
      {
       fileRefer.upload(new URLRequest("UploadPage.aspx"));
      }
     }
    }

    8. 连接Socket服务器

    Socket套接字连接允许Flash播放器通过指定的端口与服务器通信,socket连接与其他通信技术最大的不同是socket连接在数据传输完成后不会自动关闭

    当socket连接创建后,连接会一直保持,直到客户端(Flash播放器)和服务端主动关闭,因此服务器可在任何时间不用客户端请求即可发送数据给客户端

    Flash播放器提供了两种类型的socket连接。一种是早期版本就有的XMLSocket,Flash播放器9增加了二进制socket连接

    使用flash.net.XMLSocket类创建XML数据格式的socket连接,使用flash.net.Socket类创建二进制数据格式socket连接

    XML socket连接以XML数据报交换数据,二进制socket连接时ActionScript3.0新增的功能,相比之下更低级,但功能很强大,几乎可以连接任意类型的socket服务端程序。例如二进制sockets 可连接邮件服务端程序(POP3, SMTP, 和IMAP), 新闻服务器(NNTP), 聊天室服务器或远程桌面VNC服务器( RFB)

    不管是哪种类型的socket连接,其通信方式都是异步的,也就是说你不能直接从socket连接中读取数据,而是通过事件处理函数进行读取处理

    使用Socket.connect()或XMLSocket.connect()方法建立连接并监听connect事件确定连接是否建立,如果连接失败,可能的异常有:runtime error、ioError、securityError

    connect(host,port)的参数说明:

    host -- 指定域名或IP地址,如www.example.com、localhost、192.168.1.101

    port -- 连接的端口号,必须大于1024,如果小于1024则需服务器提供策略文件允许

    package {
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.net.XMLSocket;
     public class Sample0727 extends Sprite
     {
      private var xmlSocket:XMLSocket;
      
      public function Sample0727()
      {
       xmlSocket = new XMLSocket();
       xmlSocket.addEventListener(Event.CONNECT,onConnect);
       xmlSocket.connect("localhost",7777);
      }
      
      private function onConnect(event:Event):void
      {
       trace("连接成功!");
      }
     }
    }

    9. 发送数据给socket服务器

    对于Socket对象,是使用write方法(writeByte(),writeUTFBytes()等等)把数据写入到缓冲区,再通过flush()方法发送数据;对于XMLSocket对象使用send()方法

    当使用Socket对象发送数据时必须先把数据写到缓冲区,Socket类定义了一系列方法用于写数据,每个方法都是写入不同类型的数据,例如writeUTF()和writeUTFBytes()方法可以写入字符串;writeUTFBytes()方法可以写入字节形式的字符串,writeUTF()方法写入字节数字

    writeMultiByte()方法也是写入字符串数据,但可以不使用默认字符集,该方法接受两个参数:字符串和指定字符集编码,例如:

    socket.writeMultiByte("我很好","utf-8");

    XMLSocket类发送数据就比较简单了,发送数据的方法为send( ),send( )方法接受任意类型的数据类型,它会把参数转换为字符串并发送给服务器,一般这个参数是一个XML对象:xmlSocket.send(xml);

    实际上发送的数据类型是由服务器所决定的,如果服务器接受XML 数据,那必须发送XML 数据,如果服务器接受URL-编码数据,则必须发送URL-编码数据

    package {
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.MouseEvent;
     import flash.net.Socket;
     public class Sample0727 extends Sprite
     {
      public function Sample0727()
      {
       stage.addEventListener(MouseEvent.CLICK,onClick);
      }
      
      private function onClick(event:MouseEvent):void
      {
       var socket:Socket = new Socket();
       socket.addEventListener(Event.CONNECT,onConnect);
       socket.connect("localhost",7777);
       //socket.writeUTF("way back into love\n");
     
       socket.writeMultiByte("我很好","utf-8");
       socket.flush();
      }
      
      private function onConnect(event:Event):void
      {
       trace("连接成功!");
      }
     }
    }

    10. 接收Socket服务器发送来的数据

    对于Socket实例,可以通过ProgressEvent.SOCKET_DATA事件读取数据,可用readByte()、readInt()、readMultiByte()等方法

    对于XMLSocket实例,可以通过DataEvent.DATA事件读取数据,其中dataEvent.data为返回的字符串数据,需用XML构造函数转换为XML实例,最后通过E4X 语法输出XML

    Socket对象发送数据代码:

    socket.writeMultiByte("老胡","GB2312");

    socket.flush();

    Socket对象读取数据代码:

    var str:String = socket.readMultiByte(socket.bytesAvailable,"gb2312");

    package {
     import flash.display.Sprite;
     import flash.events.DataEvent;
     import flash.events.Event;
     import flash.events.MouseEvent;
     import flash.events.ProgressEvent;
     import flash.net.Socket;
     import flash.net.XMLSocket;
     import flash.text.TextField;
     import flash.text.TextFieldAutoSize;
     public class Sample0728 extends Sprite
     {
      private var socket:Socket;
      private var lblReceive:TextField;
      
      public function Sample0728()
      {
       //发送按钮 
       var btnSend:TextField = new TextField();
       btnSend.text = "发送";
       btnSend.addEventListener(MouseEvent.CLICK,onSendClick);
       this.addChild(btnSend);
       
       //关闭连接按钮 
       var btnClose:TextField = new TextField();
       btnClose.text = "关闭";
       btnClose.y = 50;
       btnClose.addEventListener(MouseEvent.CLICK,onCloseClick);
       this.addChild(btnClose);
       
       //接收文本 
       lblReceive = new TextField();
       lblReceive.autoSize = TextFieldAutoSize.CENTER;
       lblReceive.x = lblReceive.y = 100;
       this.addChild(lblReceive);
      }
      
      private function onCloseClick(event:MouseEvent):void
      {
       trace("fuck");
       if(socket!=null && socket.connected)
       {
        trace("you");
        this.lblReceive.text = "连接状态为:"+ socket.connected;
        socket.close();
        this.lblReceive.appendText(",连接状态为:"+ socket.connected);
       }
      }
      
      private function onSendClick(event:MouseEvent):void
      {
       socket = new Socket("localhost",7777);
       socket.addEventListener(Event.CONNECT,onConnect);
       socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
      }
      
      private function onSocketData(event:ProgressEvent):void
      {
       this.lblReceive.text =  "接收到的数据:" + socket.readMultiByte(socket.bytesAvailable,"gb2312");
      }
      
      private function onConnect(event:Event):void
      {
       //socket.writeUTF("wayne"); 
       socket.writeMultiByte("老胡","GB2312");
       socket.flush();
      }
     }
    }
  • 相关阅读:
    面向对象简述
    python面向对象
    Python中int()函数的用法浅析
    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
    python中关于round函数的小坑
    Xmind8破解,以及相关的流程和破解包
    生成器和生成器表达式
    brush图标
    js声明全局变量的方式
    js修改全局变量
  • 原文地址:https://www.cnblogs.com/CoderWayne/p/1778089.html
Copyright © 2011-2022 走看看