2010-03-05 81 views
0

嘗試將數據寫入套接字並讀取響應。PHP:連接:保持活着問題讀取套接字數據

$packet = "GET /get-database HTTP/1.1\r\n"; 
$packet .= "Host: 192.168.3.136:3689\r\n"; 
//$packet .= "Accept-Encoding: gzip\r\n"; 
$packet .= "Viewer-Only-Client: 1\r\n"; 
$packet .= "Connection: keep-alive\r\n\r\n"; 

socket_write($socket, $packet, strlen($packet)); 

do{ 
    $buf = ""; 
    $buf = socket_read($socket, 4096); 
    $data .= $buf; 
}while($buf != ""); 

echo "$data\r\n\r\n"; 

如果我設置連接到close那麼它的工作原理和我能夠讀取響應。問題在於,在我讀取數據之後,我需要回寫套接字。該響應包含我需要發回以進行驗證的ID。如果我在兩個單獨的套接字上寫入服務器,它會拒絕驗證回覆。所以我只能假設,我需要發佈相同的「開放連接」或「會話」。

有什麼想法?

我想弄清楚爲什麼我不能從插座與Connection: keep-alive

#######編輯閱讀

已經有這個有點發展。 我試圖使這個非常簡單的,所以我可以查明問題:

現在我的代碼如下所示:

$fp = pfsockopen("192.168.3.136", "3689"); 
$content = "GET /login?id=a90347 HTTP/1.1\r\n"; 
$content .= "Connection: keep-alive\r\n\r\n"; 

fputs($fp, $content); 

while (!feof($fp)) { 
    echo fgets($fp, 8192); 
} 

會發生什麼,只要我做我的fputs,我得到來自服務器的響應標題如下所示:

HTTP/1.1 200 OK 
Date: Fri, 05 Mar 2010 22:05:47 GMT 
RIPT-Server: iTunesLib/3.0.2 (Mac OS X) 
Content-Type: application/x-dmap-tagged 
Content-Length: 32 

然後我的光標就在那裏。在任何地方從15秒到一分鐘之後,我會在的有時候獲取內容,但我仍然停留在while循環中。

有誰知道,如果在服務器發送響應頭之後,如果我應該發回一些東西讓它知道我準備好了內容?

同樣,我不認爲這是事實,因爲當我查看網絡上的數據包時,我可以看到整個響應。這一點以及我有時會得到答覆內容的事實。這真的像PHP無法處理這個或我只是基地的方式。

仍然需要幫助..... :(

工作守則
$fp = pfsockopen("192.168.3.136", "3689"); 
$header = "GET /login?id=5648349 HTTP/1.1\r\n"; 
$header .= "Connection: keep-alive\r\n\r\n"; 

fputs($fp, $header); 

$headers = array(); 

while(true){ 
    $line = fgets($fp, 8192); 
    if($line == "\r\n"){ break; } 
    $line_parts = explode(': ',$line); 
    echo $line_parts[1]."\r\n"; 
    $headers[$line_parts[0]] = $line_parts[1]; 
} 
$content = fread($fp,intval($headers['Content-Length'])); 
echo $content; 

現在,我不得不警惕的「\ r \ n」個試驗,我相信這是可能的一些對策可能只有標題後發送「\ n」

+0

你確定連接仍然有效嗎?即使「連接:保持活力」? – 2010-03-05 05:37:16

+0

據我所知。我不知道連接何時會死掉,因爲它掛在「socket_read」上。 – 2010-03-05 07:06:06

+0

如果您的描述是準確的,那麼遠程系統不會實現HTTP - 這是無狀態的。 – symcbean 2010-03-05 14:22:16

回答

2

你嘗試套接字設置爲非阻塞模式

socket_set_nonblock($socket); 

EDIT1:?好的。只是一個預感...試試這...

$fp = pfsockopen("192.168.3.136", "3689"); 
$content = "GET /login?id=a90347 HTTP/1.1\r\n"; 
$content .= "Connection: keep-alive\r\n\r\n"; 

fputs($fp, $content); 

$headers = array(); 

do 
{ 
    $line = fgets($fp, 8192); 
    $line_parts = ecplode(': ',$line); 
    $headers[$line_parts[0]] = $line_parts[1]; 
} while($line != ''); 

$content = fread($fp,intval($headers['Content-Length'])); 

echo $content; 
+0

我確實嘗試過,但這似乎並不是問題,因爲我不需要做任何事情,直到我收到最初的回覆。有更多的發展:)雖然仍然堅持這一點。 我不知道如何在評論中發佈代碼,因爲它似乎總是聚集在一起,所以我要編輯我的問題。 – 2010-03-05 22:23:08

+0

@Senica:我只是用非阻塞來猜測......但我知道在問題中發佈代碼是正確的方式去那裏。 – Josh 2010-03-05 22:31:15

+0

@Senica:我仍然抓着吸管,但看到我更新的答案... – Josh 2010-03-05 22:41:02