【发布时间】:2012-04-08 05:23:06
【问题描述】:
我将创建一个简单的 HTTP 服务器,我还将为其创建一些客户端。现在我正在通过浏览器使用 HTTP::Daemon 测试我在 perl 中创建的简单服务器。
我的服务器代码如下:
use HTTP::Daemon;
use HTTP::Status;
my $d = HTTP::Daemon->new(LocalPort => 80,
Listen => 20) || die;
print "Web Server started!\n";
print "Server Address: ", $d->sockhost(), "\n";
print "Server Port: ", $d->sockport(), "\n";
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
print "received a request...\n";
while (my $r = $c->get_request) {
print "URI: " . $r->uri->path . "\n";
if ($r->method eq 'GET' and $r->uri->path eq "/") {
# remember, this is *not* recommended practice :-)
$c->send_file_response("http_daemon_test.pl");
}
else {
print "method: " . $r->method;
print " uri:" . $r->uri . "\n";
$c->send_error(RC_FORBIDDEN, "please do not try again")
}
}
$c->close;
undef($c);
}
目前,我的问题是,当我在同一台机器上测试该服务器时,它可以正常工作。当我尝试通过同一网络中的另一台计算机访问服务器时,服务器根本没有收到请求。我是否错过了将服务器暴露给外界的强制性(可能很简单?我是新手!)步骤?
感谢您在这方面的帮助,
更新:下面是我运行服务器时收到的输出示例:
Web 服务器已启动!
服务器地址:0.0.0.0
服务器端口:80
请联系我:
收到请求...
收到请求...
URI:/
收到请求...
URI:/
收到请求...
收到请求...
URI:/
最新更新:
我意识到问题与我上面描述的不同。毕竟,我可以从另一台计算机访问我的服务器。从代码中可以看出,我没有创建单独的线程来满足请求。奇怪的是,当我从浏览器访问我的服务器时,来自其他计算机的所有请求都会超时,直到我关闭最初发送请求的浏览器(并得到请求的答案)。同时,来自同一浏览器的多个请求都成功完成。但是,当我使用 libwww-perl 库从用 Perl 编写的客户端发送请求时,不会发生这种情况。
这如何转化为最初的问题? 每次我想测试我的服务器时,我都会先在同一台机器上使用浏览器进行测试。然后,我尝试在不关闭最初测试服务器的浏览器的情况下从另一台机器访问服务器;而且,正如预期的那样,它没有用。
感谢你们的 cmets 伙计们。
【问题讨论】:
-
让我们从更多信息开始。当你启动你的服务器时,它会打印出一些东西。请提供这些。
标签: perl http http-daemon