日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AS3 CookBook学习整理(十七)

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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学习整理(十七)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。