2012-06-29 45 views
0

我想實現一個聊天應用程序,其中php將充當服務器,而android將充當客戶端。Socket編程PHP腳本不斷加載

問題是,PHP腳本不斷加載,並不停止。當我介紹一個循環來監聽和輸出從我的android模擬器連續發送的消息。但是當我刪除循環它一直加載,並儘快我從我的android模擬器發送消息,它輸出一次,腳本stops.Now我不知道如何完成這一點(即每當我發送消息從android它呼應在頁面上他們,並繼續這樣做,直到我發送出口消息退出腳本)。

這裏是我的PHP腳本:

set_time_limit (0); 

$address = '10.116.27.107'; 
$port = 1234; 

$sock = socket_create(AF_INET, SOCK_STREAM, 0); 
socket_bind($sock, $address, $port) or die('Could not bind to address'); 

socket_listen($sock); 
while(1) 
{ 
    $client = socket_accept($sock); 
    $input = socket_read($client, 1024); 

    $output = preg_replace("[ \t\n\r]","",$input).chr(0); 
    socket_write($client, $output); 

     if($input=="exit") 
    break; 

echo $input; 

socket_close($client); 

} 
socket_close($sock); 
+0

你是什麼意思「不停止加載」?你想在瀏覽器中打開它嗎?實際上,服務器部分*意味着*永不停止加載,直到它被迫退出。 – Lyth

回答

1

爲了實現你要提高你的代碼,以便它可以處理多個連接,這不僅僅是複雜頗有幾分聊天應用讀寫一位客戶。從我的經驗來看,這是一個從單一用戶系統到多用戶系統的巨大飛躍,這就是爲什麼學習如何通過反覆試驗來編寫聊天系統需要時間的原因。

不過我相信做上面會幫助你避免你的問題,我猜是最可能是由於所謂阻塞 - 該系統正在等待輸入/輸出繼續之前並沒有得到任何。

基本上有幾件事情你需要採取在考慮到與聊天應用:

  1. 你需要運行從PHP命令行聊天腳本,在瀏覽器中運行將爲您呈現更多與超時有關的複雜問題以及瀏覽器期望網頁如何工作的問題。如果你使用的是Mac OSX,你可以使用終端,如果你知道linux,你可以明顯地使用linux,如果你在Windows上...... get puTTY並連接到一個linux服務器,我相信你可以在Windows上運行php命令行,它不是我曾經嘗試過的(或者希望)。

  2. 你需要使用socket_select()在用戶評論http://uk.php.net/socket_select中有一些簡單的例子說明如何使用它。

  3. 你總是需要知道客戶端處於什麼狀態 - 即只讀時,你可以讀,只寫時,你可以寫......通常,如果你能讀或寫,那麼你必須所以爲了讓事情繼續順利進行(而不是結束凍結) - 聊天應用程序非常棘手,正是出於這個原因。

  4. 客戶端可能會突然斷開連接,因此您需要在讀取和寫入過程中處理此問題。

  5. 無論何時讀寫 - 尤其是使用php - 讀寫功能可能無法一次發送或接收所有信息。與fwrite()fread()類似,您應該檢查已寫入的內容(如果未完成,請繼續寫入)並繼續讀取,直到沒有其他內容要讀取爲止。

  6. 根據客戶的不同,某些系統希望消息以特定終止字符結束/終止 - 即\ n或\ 0。大多數聊天應用程序要麼檢測使用哪種應用程序,要麼發送這兩種應用程序作爲每個謹慎消息的一部分