2011-12-01 118 views
5

我從使用java的android設備連接到使用DefaultHttpClient運行PHP的服務器。檢測來自PHP的android java客戶端連接超時

我正在做的一個測試是檢查,如果服務器需要長時間發送數據,java代碼會正常處理自身。如果確實需要很長時間,則會斷開連接並重試。

目前我有設置在連接超時時間爲3秒:

HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

在PHP腳本處於睡眠狀態,持續10秒服務器:

sleep(10); 

Java代碼的工作,如果腳本需要3秒以上的時間,然後拋出一個java.net.SocketTimeoutException,然後在少量時間後重試。

PHP腳本繼續運行,它是而不是我想要的。我試過在睡眠函數後直接使用connection_aborted進行測試,但它沒有捕獲已經發生的客戶端斷開連接。

ignore_user_abort(true); 
sleep(10); 
print "black hole"; 
flush(); 
if(connection_aborted()!=0){ 
     // You would think this works but it does not. 
} 

建議如何處理?

+0

什麼相關的PHP代碼是什麼樣子? – Phil

+0

@在一條簡單的線上睡10秒。 – zaf

+0

@Phil我已經用connection_aborted添加了我的嘗試 – zaf

回答

0

不知道現在是否一樣,但很久以前我碰到php沒有意識到連接被中止,直到它實際上試圖寫入或刷新其輸出緩衝區。看到PHP的flush()和ob_flush();我不需要真正寫任何輸出,只需清空空緩衝區就足以讓它檢查。

我會想象web服務器和其他東西在php前面可能會影響這種行爲。

您可能需要已經調用ignore_user_abort(true);否則php可能會在flush()調用時停止執行(默認行爲是在它意識到連接消失時停止),所以你的if語句永遠不會被執行。

+0

是的,它似乎指出了簡單的睡眠腳本沒有輸出任何內容的事實。讓我們看看在connection_abort函數觸發之前是否調用flush。 – zaf

+0

我的嘗試失敗。用更新後的代碼查看我的問題。 – zaf

-1
print 
"black hole"; 
flush(); 
if(connection_aborted()!=0){ 
     // You would think this works but it does not. 
    } 

實際上,你不會認爲這會起作用,因爲它需要php腳本才能到達腳本中的那一點。如果你在最後寫了它,那麼腳本必須按照它的方向​​運行。

我反而建議:

for($i=0;$i<10;$i++){ 
    echo ' '; ## echo "\0"; might also work 
    flush(); 
    if(connection_aborted()!=0){ 
      // You would think this works but maybe it will now. 
      die(); 
     } 
    sleep(1); # the sleep should come after the check 
} 

試試看吧。顯然,你正在試圖睡10秒,然後殺死腳本......在所有情況下,腳本將運行10秒。

2

我在不久之前寫了一篇關於這個主題的文章,我會在這裏給出一個簡短的答案,並且假設也可以發佈相關鏈接?

從本質上講,只有在它試圖使用連接到該遠程套接字的套接字時,PHP纔會發現遠程客戶端已斷開連接,直到您要求它對該套接字執行任何操作時,它會認爲一切正常。下面是我用它來檢查遠程斷開代碼:

public function isAlive(){ 
     $res = @socket_recv($this->sockHandle, $data, 1024, MSG_PEEK); 
     if($res === 0){ 
     return false; 
     }else{ 
     return true; 
     } 
} 

這裏最重要的部分是MSG_PEEK停止被清除任何未決的消息,而「@」靜音錯誤,如果插座是好的,但沒有消息未處理的。

對於完整的文章,這是可以在這裏找到:

http://www.bracketbrotherhood.com/remote-disconnections-php-non-blocking-server-sockets/programming-and-development/

問候, 菲爾,

+0

不錯的文章閱讀和謝謝你的答案。我已經推出了代碼,因此可能需要一些時間來全面測試您的想法。 – zaf