2011-05-17 88 views
1

異步套接字連接傳送大量數據的問題我有Android應用程序,經由異步套接字連接的服務器通信來傳輸的信息稍大分組(高達11兆)。爲了適應這種互動,我將小睡放在數據發送和接收的關鍵點上。在WiFi上連接工作。做一個讀或寫的信息的大小似乎並不足夠,但我已經創建了函數來保持讀取套接字,直到傳輸完成。跨越Android中

正如我所說的所有這些工作在WiFi上。但是,在3G或邊緣網絡上,傳輸失敗,中途中斷,並且通常是錯誤的。我已經進行了無數的檢查和睡眠,以確保信息有機會通過,但是它沒有通過。

不幸的是,很難像到問題的根源清晰。我已經工作了好幾天,試圖儘可能優雅地解決這個問題,但沒有成功。

TLDNR無線網絡能夠發送數據,但移動網絡失敗。我需要知道爲什麼以及如何解決它。

謝謝。

+0

你能用一些簡單的代碼重新創建問題嗎? :)另外,我不會打擾在您的代碼中插入'sleep()'調用; TCP上的'write()'是一個阻塞操作,所以當內核TCP堆棧不能接受更多輸入時,你的發送線程將被置入睡眠狀態。只要做一個快速的循環,並一次寫入'()'4096字節。 (好的小魔術數字,不要太大,不要太小,也許你會很幸運,並獲得頁面對齊的更快的數據訪問。) – sarnold 2011-05-17 00:08:26

+0

在這個項目中我很早就發現的一件事情是,當發送數據量最大在任何給定的時間發送。如果我試圖在沒有至少非常小的睡眠的情況下進行另一次寫入,則整個寫入變得毫無價值。同樣,我實際上得到了3g每次讀取睡眠時間爲3秒(這是一段非常長的時間),但是在做了其他一些停止工作的變化之後。這就是爲什麼我試圖找到更好的方法。我將努力爲您獲取一些代碼。 – Pyrodante 2011-05-17 16:08:08

+0

我終於找出了答案:基本上我假設我的read()on 3g將足夠大,以獲得有意義的數據塊。謝謝你的4096,它指出了我的正確方向。基本上它讀取信息(XML數據),直到它變得有意義,然後繼續前進。謝謝! – Pyrodante 2011-05-17 21:01:26

回答

2

實際問題被證明是每read()接收量爲顯着更小然後我的預期。我的程序需要在程序知道如何使用它之前通過XML發送整個模式。它沒有收到足夠的繩子,所以會死亡。現在它檢查/ schema標籤是否在字符串中(通過if(!response.contains("/schema"))),並且在找到或超時之前不停止讀取。