簡體   English   中英

PHP:連接:保持活動狀態讀取套接字數據

[英]PHP: Connection: keep-alive problem reading socket data

嘗試將數據寫入套接字並讀取響應。

$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從套接字讀取內容Connection: keep-alive

#######編輯

在此方面已有一些進展。 我正在嘗試使其變得非常簡單,以便我可以查明問題所在:

現在,我的代碼如下所示:

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

發生的事情是,一旦執行了fput,我就會從服務器獲得一個響應標頭,如下所示:

 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”。

您是否嘗試將套接字設置為非阻止模式?

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM