AS3 CookBook学习整理(十七)

本文详细介绍Flash中文件操作的方法,包括下载、上传、浏览本地文件等,以及如何使用Socket进行网络通信,涵盖连接服务器、发送接收数据等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 下载文件

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

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

 {
 flash.display.Sprite;
 flash.errors.IllegalOperationError;
 flash.errors.MemoryError;
 flash.events.IOErrorEvent;
 flash.events.MouseEvent;
 flash.events.SecurityErrorEvent;
 flash.net.FileReference;
 flash.net.URLRequest;
  Sample0723Sprite
 {
   Sample0723()
  {
   stage.addEventListener(MouseEvent.CLICK,onClick);
  }
  
   onClick(event:MouseEvent):
  {
   urlRequest:URLRequest = URLRequest();
   fileRefer:FileReference = FileReference();
   fileRefer.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
   fileRefer.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
   
   
   {
    fileRefer.download(urlRequest,);
   }
   (illegalOperation:IllegalOperationError)
   {
     
   }
   (security:SecurityError)
   {
     
   }
   (argument:ArgumentError)
   {
     
   }
   (memory:MemoryError)
   {
     
     
     
     
   }
  }
  
   onSecurityError(event:SecurityErrorEvent):
  {
   ();
  }
  
   onIOError(event:IOErrorEvent):
  {
   ();
  }
 }
}

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

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

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

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.events.MouseEvent;
 flash.net.FileReference;
 flash.net.URLRequest;
  Sample0723Sprite
 {
  fileRefer:FileReference;
  
   Sample0723()
  {
   stage.addEventListener(MouseEvent.CLICK,onClick);
   fileRefer = FileReference();
   fileRefer.addEventListener(Event.SELECT,onSelect);
   fileRefer.addEventListener(Event.CANCEL,onCancel);
  }
  
   onClick(event:MouseEvent):
  {
   urlRequest:URLRequest = URLRequest();
   
   {
    fileRefer.download(urlRequest,);
   }
   (error:Error)
   {
    (error.message);
   }
  }
  
   onSelect(event:Event):
  {
   (+(event.target    FileReference).name);
  }
  
   onCancel(event:Event):
  {
   ();
  }
 }
}

3. 监视文件下载进度

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

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

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.events.MouseEvent;
 flash.events.ProgressEvent;
 flash.net.FileReference;
 flash.net.URLRequest;
 flash.text.TextField;
 flash.text.TextFieldAutoSize;
  Sample0724Sprite
 {
  label:TextField;
  fileRefer:FileReference;
  
   Sample0724()
  {
   label = TextField();
   label.text = ;
   label.autoSize = TextFieldAutoSize.CENTER;
   .addChild(label);
   stage.addEventListener(MouseEvent.CLICK,onClick);
   
   fileRefer = FileReference();
   fileRefer.addEventListener(ProgressEvent.PROGRESS,onProgress);
   fileRefer.addEventListener(Event.COMPLETE,onComplete);
  }
  
   onClick(event:MouseEvent):
  {
   fileRefer.download(URLRequest());
  }
  
   onProgress(event:ProgressEvent):
  {
   label.text = event.bytesLoaded +  + event.bytesTotal;
  }
  
   onComplete(event:Event):
  {
   label.text = ;
  }
 }
}

4. 浏览本地文件

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

 {
 flash.display.Sprite;
 flash.errors.IllegalOperationError;
 flash.net.FileReferenceList;
  Sample0724Sprite
 {
   Sample0724()
  {
   fileReferList:FileReferenceList = FileReferenceList();
   
   {
    fileReferList.browse();
   }
   (illegalOperation:IllegalOperationError)
   {
     
     
     
   }
  }
 }
}

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

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

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

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

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

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

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

 {
 flash.display.Sprite;
 flash.errors.IllegalOperationError;
 flash.net.FileFilter;
 flash.net.FileReferenceList;
  Sample0724Sprite
 {
   Sample0724()
  {
   fileFilter0:FileFilter = FileFilter(,);
   fileFilter1:FileFilter = FileFilter(,);
   fileFilter2:FileFilter = FileFilter(,);
   
   fileReferList:FileReferenceList = FileReferenceList();
   fileReferList.browse([fileFilter0,fileFilter1,fileFilter2]);
  }
 }
}

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

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

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.net.FileReferenceList;
  Sample0724Sprite
 {
  fileReferList:FileReferenceList;
  
   Sample0724()
  {
   fileReferList = FileReferenceList();
   fileReferList.addEventListener(Event.SELECT,onSelect);
   fileReferList.addEventListener(Event.CANCEL,onCancel);
   fileReferList.browse();
  }
  
   onSelect(event:Event):
  {
   fileList:Array = (event.target    FileReferenceList).fileList;
   (str:String    fileList)
   {
    (fileList[str].name++fileList[str].size);
   }
  }
  
   onCancel(event:Event):
  {
   ();
  }
 }
}

7. 上传文件

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

服务器端代码(.net)

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代码:

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.events.ProgressEvent;
 flash.net.FileReference;
 flash.net.URLRequest;
 flash.text.TextField;
 flash.text.TextFieldAutoSize;
  Sample0727Sprite
 {
  fileRefer:FileReference;
  label:TextField;
  
   Sample0727()
  {
   label = TextField();
   label.autoSize = TextFieldAutoSize.CENTER;
   .addChild(label);
   
   fileRefer = FileReference();
   fileRefer.addEventListener(ProgressEvent.PROGRESS,onProgress);
   fileRefer.addEventListener(Event.SELECT,onSelect);
   fileRefer.browse();
   
  }
  
   onProgress(event:ProgressEvent):
  {
   label.text = event.bytesLoaded +  + event.bytesTotal;
  }
  
   onSelect(event:Event):
  {
   fileRefer.upload(URLRequest());
  }
 }
}

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则需服务器提供策略文件允许

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.net.XMLSocket;
  Sample0727Sprite
 {
  xmlSocket:XMLSocket;
  
   Sample0727()
  {
   xmlSocket = XMLSocket();
   xmlSocket.addEventListener(Event.CONNECT,onConnect);
   xmlSocket.connect(,7777);
  }
  
   onConnect(event:Event):
  {
   ();
  }
 }
}

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-编码数据

 {
 flash.display.Sprite;
 flash.events.Event;
 flash.events.MouseEvent;
 flash.net.Socket;
  Sample0727Sprite
 {
   Sample0727()
  {
   stage.addEventListener(MouseEvent.CLICK,onClick);
  }
  
   onClick(event:MouseEvent):
  {
   socket:Socket = Socket();
   socket.addEventListener(Event.CONNECT,onConnect);
   socket.connect(,7777);
    
   socket.writeMultiByte(,);
   socket.flush();
  }
  
   onConnect(event:Event):
  {
   ();
  }
 }
}

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");

 {
 flash.display.Sprite;
 flash.events.DataEvent;
 flash.events.Event;
 flash.events.MouseEvent;
 flash.events.ProgressEvent;
 flash.net.Socket;
 flash.net.XMLSocket;
 flash.text.TextField;
 flash.text.TextFieldAutoSize;
  Sample0728Sprite
 {
  socket:Socket;
  lblReceive:TextField;
  
   Sample0728()
  {
    
   btnSend:TextField = TextField();
   btnSend.text = ;
   btnSend.addEventListener(MouseEvent.CLICK,onSendClick);
   .addChild(btnSend);
   
    
   btnClose:TextField = TextField();
   btnClose.text = ;
   btnClose.y = 50;
   btnClose.addEventListener(MouseEvent.CLICK,onCloseClick);
   .addChild(btnClose);
   
    
   lblReceive = TextField();
   lblReceive.autoSize = TextFieldAutoSize.CENTER;
   lblReceive.x = lblReceive.y = 100;
   .addChild(lblReceive);
  }
  
   onCloseClick(event:MouseEvent):
  {
   ();
   (socket!=null && socket.connected)
   {
    ();
    .lblReceive.text = + socket.connected;
    socket.close();
    .lblReceive.appendText(+ socket.connected);
   }
  }
  
   onSendClick(event:MouseEvent):
  {
   socket = Socket(,7777);
   socket.addEventListener(Event.CONNECT,onConnect);
   socket.addEventListener(ProgressEvent.SOCKET_DATA,onSocketData);
  }
  
   onSocketData(event:ProgressEvent):
  {
   .lblReceive.text =   + socket.readMultiByte(socket.bytesAvailable,);
  }
  
   onConnect(event:Event):
  {
    
   socket.writeMultiByte(,);
   socket.flush();
  }
 }
}

 

转载于:https://www.cnblogs.com/CoderWayne/archive/2010/07/15/1778089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值