2010-03-05 148 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