2012-05-14 81 views
0

我有一個使用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上。我懷疑這可能是造成問題的內容長度或響應時間,但在兩種情況下,我都有相反的反例。除了長度大小的情況下,較長的計數器例子的數值開始,所以就是這樣。

+0

我的第一個猜測是用戶根本沒有良好的4g連接,並且無法使用它連接到服務器。 – Shellum

+0

@Chuck Norris - 行爲('BACKGROUND'工作,其他消息不工作)在20次嘗試中是一致的。而且,在所有這些情況下,請求部分(帶有文件上載)完成沒有問題。所以,這似乎不是一個連接問題。這是我的第一個想法,但我相信我已經排除了。用戶表示他們的4G連接上有完整的條形圖,但不太確鑿的證據。 – Andrew

+0

@Chuck Norris - 也許我在這裏倉促。我無法在任何地方找到的是這種行爲是否適合一個微弱的信號。即文件總是成功上傳,但在X秒後,4G信號變得足夠低,從而失去了連接,但是沒有意識到,因此仍然等待套接字超時。那可能嗎?或者它可以實際上仍然連接,但只是錯過響應數據包做噪聲? – Andrew

回答

0

它似乎是導致問題的響應之前的延遲。我使用本指南Easy Parallel Processing in PHP來設置多任務php配置。通過這種方式,我有一個腳本,可以計算和迴應經過的秒數,而另一個人執行作業處理。現在問題已解決。