AS3 CookBook学习整理(十七)
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
總結
以上是生活随笔為你收集整理的AS3 CookBook学习整理(十七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原创】FPGA (Verilog/NI
- 下一篇: 2003 SERVER 本地连接 TCP