2010-06-23 37 views
1

我試圖將一些數據寫入原始數據套接字(大約22 MB)。該方案是這樣的: -使用Flash/Adob​​e Air 2.0插座難度

  1. 打開本地文件
  2. 讀取的字節的塊。
  3. 將它寫入套接字
  4. 重複2 & 3直到文件結束。

現在的問題是,我的代碼(下)沒有傳輸完整的文件。它可以用我的測試文件在22 MB中傳輸3個數據。跟蹤完成並顯示正在傳輸的完整數據。我懷疑,也許它會在完成當前版塊之前開始編寫下一個塊(儘管我不確定)。

while(fs.bytesAvailable > 0){ 
    var readAmount = (fs.bytesAvailable < socketBufferSize) ? fs.bytesAvailable : socketBufferSize; 
    seq++; 
    air.trace(">"+seq+" WritePacket "+readAmount+" "+fs.position+" "+fs.bytesAvailable); 
    fs.readBytes(bytes, 0, readAmount); 
    air.trace(bytes.length); 
    socket2.writeBytes(bytes, 0, bytes.length); 
    socket2.flush(); 
} 
fs.close(); 
socket2.close(); 

上面是我應該使用的代碼。我想知道我是否做對/錯。

插入寫迭代之間的強制延遲確保了文件被完全傳送在下面的代碼段指示。但這不是一個可接受的解決方案。我想知道是否有某個事件我應該訂閱,或者是否有任何需要改變的地方。另一端的服務器是FileZilla FTP Server。

var sendData = function(){ 
    if(fs.bytesAvailable > 0){ 
    var readAmount = (fs.bytesAvailable < socketBufferSize) ? fs.bytesAvailable : socketBufferSize; 
    seq++; 
    air.trace(">"+seq+" WritePacket "+readAmount+" "+fs.position+" "+fs.bytesAvailable); 
    fs.readBytes(bytes, 0, readAmount); 
    air.trace(bytes.length); 
    socket2.writeBytes(bytes, 0, bytes.length); 
    socket2.flush(); 
    } 
    else{ 
     air.trace("Closing Connection"); 
     fs.close(); 
     socket2.close(); 
    } 
} 
var interval = setInterval(sendData, 100); 

感謝

+0

顯然問題在於套接字關閉功能是殘酷的。在它有機會傳輸所有數據之前,它會過早關閉該頻道。 如果我刪除了socket.close()並等待它超時,它可以正常工作。有沒有任何正確的建議方式來做到這一點? – 2010-06-23 13:08:23

+0

哦,如果這個問題困擾着你,那麼請投票支持這個問題:http://bugs.adobe.com/jira/browse/FP-6 – 2010-06-23 13:09:10

+0

這個問題已經被空氣小組確認了, 。繼承人轉發的消息: - 您遇到的問題是,如果您過早調用close(),則丟棄尚未傳輸的數據,並立即關閉套接字。這就是插入延遲的原因:在調用close()之前,它給了數據傳輸的時間。 我們(AIR團隊)意識到這是該API中相當重要的可用性問題,我們正在努力解決它。與此同時,我認爲延遲是您的最佳選擇。 Regards, Oliver – 2010-06-24 07:16:38

回答

0

由於空氣有一個暴虐插槽關閉操作,服務器需要進行修改,以讓客戶知道什麼時候已經收到所有發送的數據(通過另一個TCP控制插座)。當然,客戶端需要在一開始就中繼多少數據。

0

它已經是我等待一個插座事件觸發時的數據寫滿了一段時間... :(

第一個想法是把一個延遲每次寫()。然而,如果後真正良好的連接,傳輸較長延遲的感覺。而在連接速度慢的情況下,延遲並不總是足夠的等等一些數據仍然會丟失:(

唯一的一個解決方案,我已經找到。是不是真的合適,但工程我用的proftpd作爲與MOD的FTP服務器,我已經寫了允許新的FTP命令:。FILESIZE 這個命令給予的八位字節文件路徑的大小

然後,在flex中,我打開了2個套接字:一個用於傳輸數據,一個用於獲取文件大小。 在每次調用第一個套接字上的write()之後,我使用第二個套接字上的FILESIZE來獲取文件的大小。

硬幣的另一面是,轉移走,因爲FILESIZE的FTP調用多的時間裏(:/),但傳輸更加可靠。

這是一種可能會從Flex遷移到Java的問題。 Alomost兩年是問題發佈在Adobe Bug頁面上,並且...什麼都沒有...... 有沒有一種方法可以在Flex的核心中添加此功能?我不這麼認爲,閃光燈不是開源的......

+0

Vince。如果您可以共享proftpd FILESIZE命令MOD的代碼,我會非常棒。 – 2010-07-07 11:10:08