PHP:连接:保持活动问题读取套接字数据

时间:2010-03-05 05:29:31

标签: php sockets

尝试将数据写入套接字并读取响应。

$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";

如果我将Connection设置为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);
}

当我执行我的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秒到1分钟之间,我有时获取内容,但我仍然陷入了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”。

1 个答案:

答案 0 :(得分: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;