使用 HTTP::Server::Simple 实现轻量级 HTTP 服务器

在Perl中,HTTP::Server::Simple 模块提供了一种轻量级的方式来实现HTTP服务器。该模块简单易用,适合快速开发和测试HTTP服务。本文将详细介绍如何使用 HTTP::Server::Simple 模块创建和配置一个轻量级HTTP服务器。

安装 HTTP::Server::Simple

首先,需要确保安装了 HTTP::Server::Simple 模块。如果尚未安装,可以使用以下命令通过CPAN进行安装:

复制代码
cpan HTTP::Server::Simple
​

或者,如果你使用的是 cpanm,可以通过以下命令安装:

复制代码
cpanm HTTP::Server::Simple
​

创建简单的 HTTP 服务器

以下示例展示了如何创建一个最简单的HTTP服务器,该服务器在本地端口8080上运行,并返回一个简单的"Hello, World!"消息。

复制代码
use strict;
use warnings;
use HTTP::Server::Simple::CGI;

# 创建一个简单的服务器类,继承自HTTP::Server::Simple::CGI
{
    package MyWebServer;
    use base qw(HTTP::Server::Simple::CGI);

    sub handle_request {
        my ($self, $cgi) = @_;
        print "HTTP/1.0 200 OK\r\n";
        print $cgi->header,
              $cgi->start_html('Hello'),
              $cgi->h1('Hello, World!'),
              $cgi->end_html;
    }
}

# 实例化并启动服务器
my $server = MyWebServer->new(8080);
print "Server is running on http://localhost:8080\n";
$server->run();
​

以上代码创建了一个继承自 HTTP::Server::Simple::CGI 的简单服务器类 MyWebServer ,并重写了 handle_request 方法来处理请求。

扩展服务器功能

可以通过扩展 handle_request 方法来增加服务器的功能。例如,解析请求路径并返回不同的内容:

复制代码
use strict;
use warnings;
use HTTP::Server::Simple::CGI;

{
    package MyWebServer;
    use base qw(HTTP::Server::Simple::CGI);

    sub handle_request {
        my ($self, $cgi) = @_;
        my $path = $cgi->path_info;

        if ($path eq '/hello') {
            print "HTTP/1.0 200 OK\r\n";
            print $cgi->header,
                  $cgi->start_html('Hello'),
                  $cgi->h1('Hello, World!'),
                  $cgi->end_html;
        } elsif ($path eq '/goodbye') {
            print "HTTP/1.0 200 OK\r\n";
            print $cgi->header,
                  $cgi->start_html('Goodbye'),
                  $cgi->h1('Goodbye, World!'),
                  $cgi->end_html;
        } else {
            print "HTTP/1.0 404 Not Found\r\n";
            print $cgi->header,
                  $cgi->start_html('Not Found'),
                  $cgi->h1('404 - Not Found'),
                  $cgi->end_html;
        }
    }
}

my $server = MyWebServer->new(8080);
print "Server is running on http://localhost:8080\n";
$server->run();
​

在这个示例中,服务器根据请求路径返回不同的内容。对于 /hello路径,返回"Hello, World!"消息;对于 /goodbye路径,返回"Goodbye, World!"消息;对于其他路径,返回404错误。

添加日志记录

为了便于调试和监控,可以添加日志记录功能,记录每个请求的信息:

复制代码
use strict;
use warnings;
use HTTP::Server::Simple::CGI;
use POSIX qw(strftime);

{
    package MyWebServer;
    use base qw(HTTP::Server::Simple::CGI);

    sub handle_request {
        my ($self, $cgi) = @_;
        my $path = $cgi->path_info;

        # 记录请求信息
        my $log_entry = strftime("[%Y-%m-%d %H:%M:%S]", localtime) . " - $path\n";
        open my $log, '>>', 'server.log' or die "Cannot open log file: $!";
        print $log $log_entry;
        close $log;

        if ($path eq '/hello') {
            print "HTTP/1.0 200 OK\r\n";
            print $cgi->header,
                  $cgi->start_html('Hello'),
                  $cgi->h1('Hello, World!'),
                  $cgi->end_html;
        } elsif ($path eq '/goodbye') {
            print "HTTP/1.0 200 OK\r\n";
            print $cgi->header,
                  $cgi->start_html('Goodbye'),
                  $cgi->h1('Goodbye, World!'),
                  $cgi->end_html;
        } else {
            print "HTTP/1.0 404 Not Found\r\n";
            print $cgi->header,
                  $cgi->start_html('Not Found'),
                  $cgi->h1('404 - Not Found'),
                  $cgi->end_html;
        }
    }
}

my $server = MyWebServer->new(8080);
print "Server is running on http://localhost:8080\n";
$server->run();
​

此代码段通过将每个请求的信息记录到 server.log 文件中,帮助开发者了解服务器的运行情况和请求历史。

相关推荐
珠海西格5 小时前
“主动预防” vs “事后补救”:分布式光伏防逆流技术的代际革命,西格电力给出标准答案
大数据·运维·服务器·分布式·云计算·能源
阿波罗尼亚5 小时前
Kubectl 命令记录
linux·运维·服务器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.6 小时前
Keepalived单播模式配置与实战指南
linux·服务器·负载均衡
IDC02_FEIYA6 小时前
Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解
linux·运维·服务器
皇帝要考研6 小时前
【ISO 13400-2:2019】核心配置项
网络·网络协议
M158227690556 小时前
四通道全能组网!SG-Canet-410 CAN转以太网网关,破解工业CAN通信瓶颈
linux·运维·服务器
JoySSLLian7 小时前
IP SSL证书:一键解锁IP通信安全,高效抵御网络威胁!
网络·人工智能·网络协议·tcp/ip·ssl
浪客灿心7 小时前
Linux库制作与原理
linux·运维·服务器
bantinghy7 小时前
Nginx基础加权轮询负载均衡算法
服务器·算法·nginx·负载均衡
云小逸8 小时前
【网络通信】DNS、SNMP、DHCP 等 UDP 服务解析
网络·网络协议·udp