我想使用套接字打开链接并阅读html代码,到目前为止我使用的是:
my $req = <<EOT
GET / ${id} HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:identity
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:${connection}
Host:${host}
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
EOT
;
$socket->send($req);
print "skipping headers\n";
while(<$socket>) { s/^(.*?)\r?\n$/\1/; last if /^\s*\r?\n?$/; }
print "Reading Chunks\n";
my $buffer = "";
while(<$socket>)
{
last if /^HTTP/;
next if /^.{0,5}$/;
s/^\s*(.*?)\s*\r?\n$/\1/;
$buffer .= $_;
}
print $buffer;
我有两个问题......
1)while(<$socket>)
需要时间,当我将打印放在while循环中时,我可以看到只需添加最后一个标记</html>
,所有打印其他来源,它只是挂起一分钟来添加最后一个标签。
2)我没有得到页面的真实源代码,我的意思是我们使用view-source:www.example.com
得到的,我错过了什么?
编辑:
我称这个子连接在开头创建套接字
sub _connect
{
my ($peerAdd) = @_;
return IO::Socket::INET->new(
PeerAddr => $peerAdd,
PeerPort => 'http(80)',
Proto => 'tcp'
)
or die "Could not connect to $peerAdd:80!! $!"
}
提前致谢。
答案 0 :(得分:5)
您发送的HTTP / 1.1请求默认为keep-alive,例如服务器保持连接打开并等待更多请求。因此,最后一次调用只会在服务器因为不活动而关闭连接时结束,在收到请求的最后几个字节之后很久。
如果你很懒,你应该只使用LWP :: UserAgent或类似的模块。如果您想要手工完成所有事情,您可以自己处理所有杂乱的事情,例如:分块编码,压缩传输,许多非标准服务器等。这远非微不足道。