我想使用套接字打开一个链接并阅读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;
Run Code Online (Sandbox Code Playgroud)
我有两个问题......
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!! $!"
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
您发送默认保持活动的HTTP/1.1请求,例如服务器保持连接打开并等待更多请求.因此,最后一次调用只会在服务器因为不活动而关闭连接时结束,在收到请求的最后几个字节之后很久.
如果你很懒,你应该只使用LWP :: UserAgent或类似的模块.如果你想要手工完成所有事情,你就可以自己处理所有混乱的东西,例如分块编码,压缩传输,许多非标准服务器等.这远非微不足道.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |