人们! 目前我需要维护一些脚本动物园。现在我需要从类似HTTP的服务器执行顺序请求 - 响应操作。原始脚本是一个请求响应任务,所以没有任何问题。但现在我需要发出3个不同的请求,解析响应并将它们存储到PostgreSQL中。但是,例如,我们认为我们将解决谷歌问题。
$socket = IO::Socket::INET->new(PeerAddr => "google.com:80", KeepAlive => 1);
$socket->write("GET / HTTP/1.1" . $EOL);
$socket->write("Connection: keep-alive" . $EOL);
$socket->write($EOL);
$socket->flush();
while($sockbuff = $socket->getline)
{
print ("$sockbuff");
$recvbuff = $recvbuff.$sockbuff;
}
print("- REQUEST 1 -\n");
$socket->write("GET / HTTP/1.1" . $EOL);
while($sockbuff = $socket->getline)
{
print ("$sockbuff");
$recvbuff = $recvbuff.$sockbuff;
}
但是,由于Connection:keep-alive指定,进程永远不会从第一个while(读)循环中退出,因此永远不会发送第二个请求,并且会等到线程被外部终止(我需要轮询大约350个这样的服务器,因此,整个过程是线程化的)。 另一方面,如果我强制套接字以非阻塞模式运行,我只得到第一行。 任何人都可以建议我如何在Perl中进行顺序写 - 读操作时记住,这是类似HTTP的协议。
答案 0 :(得分:0)
根据评论,我建议您这样做很难。 Perl附带了一个名为LWP::UserAgent
的可爱图书馆 - 它可以让您进行网络搜索。
使用LWP::UserAgent
,您的代码如下所示:
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
my $agent = LWP::UserAgent->new( keep_alive => 1 );
my $response = $agent->get('http://www.google.com');
if ( $response->is_success ) {
print $response ->content();
}
else {
print "Failed: ", $response->status_line(), "\n";
}
你可以非常简单地扩展到多个网址我确定:)。
答案 1 :(得分:0)
任何人都可以建议我如何在Perl中进行顺序写 - 读操作,记住这是类似HTTP的协议。
使用LWP :: UserAgent,Mojo :: UserAgent或类似模块。
如果你真的想自己做:
Content-Length
和Transfer-Encoding: chunked
。 Connection
标题中的任何信息,表明该连接将被关闭。但是,例如,我们认为我们将解决谷歌问题。
更难,因为你必须在这里处理HTTPS,所以IO :: Socket :: INET不会帮助你。在这种情况下,您需要IO :: Socket :: SSL。