1

我将创建一个简单的 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);
}

目前,我的问题是当我在同一台机器上测试该服务器时,它可以正常工作。当我尝试通过同一网络中的另一台计算机访问服务器时,服务器根本没有收到请求。我是否错过了将服务器暴露给外界的强制性步骤(可能很简单?我是新手!)?

感谢您在这方面的帮助,


更新:下面是我在运行服务器时收到的输出示例:

网络服务器启动!

服务器地址:0.0.0.0

服务器端口:80

请通过以下方式与我联系:

收到请求...

收到请求...

网址:/

收到请求...

网址:/

收到请求...

收到请求...

网址:/


最近更新:

我意识到问题与我上面描述的不同。毕竟,我可以从另一台计算机访问我的服务器。从代码中可以看出,我没有创建单独的线程来满足请求。奇怪的是,当我从浏览器访问我的服务器时,来自其他计算机的所有请求都会超时,直到我关闭最初发送请求的浏览器(并得到请求的答案)。同时,来自同一浏览器的多个请求都成功完成。但是,当我使用 libwww-perl 库从用 Perl 编写的客户端发送请求时,这不会发生。

这如何转化为最初的问题? 每次我想测试我的服务器时,我都会先在同一台机器上使用浏览器进行测试。然后,我尝试在不关闭最初测试服务器的浏览器的情况下从另一台机器访问服务器;而且,正如预期的那样,它没有用。

谢谢你们的评论。

4

2 回答 2

2

问:PC(例如“myhttpserver”)是否有防火墙?您是否尝试过禁用它?

问:你试过“telnet myhttpserver 80”吗?你能“ping httpserver”吗?

这听起来更像是一个网络/网络配置问题,而不是一个编程问题。请确保主机可以互相看到,并且 http 端口是开放的。

于 2012-03-23T16:24:46.263 回答
1

似乎您没有在 HTTP::Daemon 构造函数的参数中定义 LocalAddr 。它可能默认为 localhost,在这种情况下,您将看到与您提供的完全一样的症状。尝试添加

LocalAddr => '<your ip>'

给你的构造函数,看看它是否有帮助

于 2012-03-23T17:33:40.917 回答