我有一個使用HttpURLConnection通過multipart/form-data內容類型上傳文件的例程。服務器對上傳的文件執行一些處理並返回一個簡短的響應代碼。這在所有情況下都可以正常工作,除非有一名用戶在4G時使用HTC Evo。如果用戶切換到3G,那麼一切正常。在4G上時,應用程序將等待while ((line = reader.readLine()) != null) {
,直到引發套接字連接超時異常爲止。我有連接超時設置爲70秒。該服務器是在PHP這裏是有關片段掛在Sprint 4G網絡上的HttpURLConnection readLine()
//all ob_ related entries were added because I found some info indicating
//that some clients would not acknowledge the response without the content-length header
ob_end_clean();
header("Connection: close");
ob_start();
...
//the response is one of either
echo "BACKGROUND"; //this one works!
//or
echo $rv //$rv = "1336757671374T37171FR"
//or
echo "FailedQA";
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
ob_flush();
flush();
die();
?>
注意「背景」響應工作,其餘導致客戶端坐,直到超時異常。我目前有2個概念,但我不在4G領域,所以我只能通過最終用戶測試,我真的想限制嘗試次數。我的第一個想法是'背景'比'失敗QA'稍長,而另一個更長,它有一個數字開始。所以,也許增加空白的迴應會有所幫助?另一方面是響應時間。 'BACKGROUND'消息通常比其他消息發送得更快。但是,我在這裏有一個反例,所以我不是陛下。例如:'BACKGROUND'消息通常在15到20秒內熄滅。其他消息通常是30-40秒。但是,我舉了一個例子,其中'1336757671374T37171FR'風格響應在24秒內熄滅,並且未收到,並且在27秒內收到「背景」消息。
所以總結一下:這隻發生在Sprint 4G上。我懷疑這可能是造成問題的內容長度或響應時間,但在兩種情況下,我都有相反的反例。除了長度大小的情況下,較長的計數器例子的數值開始,所以就是這樣。
我的第一個猜測是用戶根本沒有良好的4g連接,並且無法使用它連接到服務器。 – Shellum
@Chuck Norris - 行爲('BACKGROUND'工作,其他消息不工作)在20次嘗試中是一致的。而且,在所有這些情況下,請求部分(帶有文件上載)完成沒有問題。所以,這似乎不是一個連接問題。這是我的第一個想法,但我相信我已經排除了。用戶表示他們的4G連接上有完整的條形圖,但不太確鑿的證據。 – Andrew
@Chuck Norris - 也許我在這裏倉促。我無法在任何地方找到的是這種行爲是否適合一個微弱的信號。即文件總是成功上傳,但在X秒後,4G信號變得足夠低,從而失去了連接,但是沒有意識到,因此仍然等待套接字超時。那可能嗎?或者它可以實際上仍然連接,但只是錯過響應數據包做噪聲? – Andrew