在《Flex與java進行socket通訊完成以斷點續傳方式上傳檔案》中所實現的檔案斷點上傳一次僅能上傳一個檔案,而flex自身不支援多線程,無法進行對多個檔案開啟多個線程進行socket檔案傳輸,即不能迴圈檔案數組來建立多個socket通訊,令每個socket傳輸一個檔案,這樣做僅能上傳一個有問題的檔案。但我們可以採用遞迴方式來達到上傳多檔案的目的,這個過程類似於非同步線程了。
建立socket通訊後開始傳輸檔案的過程中flex端監聽三件事情:socket的串連、接收資料和socket通訊的斷開。當斷開通訊時即完成了一個檔案的傳輸,此時如果還有檔案需要傳輸,則可以繼續建立socket通訊,即調用該方法本身進行下一個檔案的傳輸。下述示意程式碼封裝含在一個flex類中。
檔案傳輸類中定義全域變數:
//檔案總數量private var fileCount:int = 0;//當前傳輸的檔案索引private var currentIndex:int = 0;//FileReference的數組,即檔案數組private var docList:Array;
主函數,用於調用上文中的遞迴函式,進行多檔案傳輸
下文方法參數fileReferenceList為調用該方法的上層類中傳入待上傳的多個檔案的數組
private function uploadDocumentContent(fileReferenceList:Array):void{fileCount = fileReferenceList.length;this.docList = fileReferenceList;if (docList != null && docList.length > 0){this.uploadFile( docList[currentIndex] as FileReference );}}
遞迴函式,實現多檔案斷點上傳的核心
private function uploadFile(file:FileReference){var socket = new Socket;socket.connect(CEConstants.SERVERIP,1234); //串連伺服器//監聽是否串連 socket.addEventListener(Event.CONNECT,function conn(){//發送名稱socket.writeUTF(file.name);socket.flush();//檔案大小socket.writeUTF(String(file.data.length));socket.flush();}); //監聽接受資料socket.addEventListener(ProgressEvent.SOCKET_DATA,function receiveData(){//已上傳大小var len:String = socket.readUTF();if(len == "0"){if(file.data.length < 1024){socket.writeBytes(file.data);}else{socket.writeBytes(file.data,0,1024);}socket.flush();}else{if((file.data.length - uint(len)) > 1024){socket.writeBytes(file.data,uint(len),1024);}else{socket.writeBytes(file.data,uint(len),file.data.length - uint(len));}socket.flush();}});//監聽串連關閉 socket.addEventListener(Event.CLOSE,function closeConn(){currentIndex++;if(currentIndex < fileCount){uploadFile(uploadFile( docList[currentIndex] as FileReference ));}else{Alert.show("上傳成功");CursorManager.removeAllCursors(); //去除滑鼠樣式}});}
有了上文的工作,即可完成對多個檔案斷點上傳的功能。在此功能之前的動作即為將用戶端的檔案載入到flash player上,即對FileReference等的利用了。值得說明的是雖然Flex自身不支援多線程,但是有一個開源項目async-threading能夠使flex支援多線程,同java的多線程比較,此處為非同步線程。拿多檔案傳輸來說明,如果是多線程的話則多個檔案會同時進行上傳,而採用了此種,則多檔案的上傳不是同時進行的。上文代碼則更為明顯是一個傳輸完後再進行下一個檔案的傳輸,而async-threading就包含類似於時間片的概念了。