尝试将数据写入套接字并读取响应。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”
你确定连接仍然有效吗?即使“连接:保持活力”? – 2010-03-05 05:37:16
据我所知。我不知道连接何时会死掉,因为它挂在“socket_read”上。 – 2010-03-05 07:06:06
如果您的描述是准确的,那么远程系统不会实现HTTP - 这是无状态的。 – symcbean 2010-03-05 14:22:16