使用 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 文件中,帮助开发者了解服务器的运行情况和请求历史。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在AI技术深度渗透的背景下,2025年传媒互联网行业的哪些细分场景和产品形态将迎来爆发式增长?

一、AI技术重构传媒互联网行业版图:从底层逻辑到应用场景 近年来,AI技术已从实验室走向商业化落地,而传媒互联网行业因其庞大的用户基数、高频交互场景和丰富的数据积累,成为AI应用的主战场。根据华源证券最新行业周报&#xff0…

Docker Hub 镜像 Pull 失败的解决方案

目录 引言一、问题二、原因三、解决方法四、参考文献 引言 在云原生技术火热的当下,Docker可谓是其基础,由于其简单以及方便性,让开发人员不必再为环境配置问题而伤脑筋,因为可将其看作一个虚拟机程序去理解。所以掌握好它可谓是…

neo4j-community-5.26.0 create new database

1.edit neo4j.conf 把 # The name of the default database initial.dbms.default_databasehonglouneo4j # 写上自己的数据库名称 和 # Name of the service #5.0 server.windows_service_nameneo4j #4.0 dbms.default_databaseneo4j #dbms.default_databaseneo4jwind serve…

unity实现回旋镖函数

最近学习unity2D,想实现一个回旋镖武器,发出后就可以在角色周围回旋。 一、目标 1.不是一次性的,扔出去、返回、没有了;而是扔出去,返回到角色后方相同距离,再次返回;再次返回,永远…

【C++基础】字符串/字符读取函数解析

最近在学C以及STL,打个基础 参考: c中的char[] ,char* ,string三种字符串变量转化的兼容原则 c读取字符串和字符的6种函数 字符串结构 首先明确三种字符串结构的兼容关系:string>char*>char [] string最灵活,内置增删查改…

求一个数的数根(高精度)

上一期我们讲的是求一个数的数根,和本期唯一不同的是,数据范围不同了,上一期这个数是小于等于10的18次方的,这一期是小于等于10的1000次方的,开一个变量?肯定不行,我们需要再开一个数组&#xf…

SpringBoot源码解析(九):Bean定义接口体系

SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…

Vue 3 30天精进之旅:Day 13 - 路由守卫

在构建单页面应用时,路由守卫是一个非常重要的概念。它允许我们在路由进入或离开时执行一些操作,比如验证用户权限、处理数据加载、执行导航确认等。Vue Router提供了多种类型的路由守卫,使我们能够灵活地控制路由的行为。在今天的学习中&…

【TypeScript】基础:数据类型

文章目录 TypeScript一、简介二、类型声明三、数据类型anyunknownnervervoidobjecttupleenumType一些特殊情况 TypeScript 是JavaScript的超集,代码量比JavaScript复杂、繁多;但是结构更清晰 一、简介 为什么需要TypeScript? JavaScript的…

C++模板编程——可变参函数模板

目录 1. 可变参函数模板基本介绍 2. 参数包展开——通过递归函数 3. 参数包展开——通过编译期间if语句(constexpr if) 4. 重载 5. 后记 进来看的小伙伴们应该对C中的模板有了一定了解,下面给大家介绍一下可变参函数模板。过于基础的概念将不仔细介绍。 1. 可变…

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域,OpenAI再次引领创新潮流,近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列,但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…

三数之和(15)

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 可以一起总结的题目&#xff1a;三角形的最大周长&#xff08;976&#xff09;-CSDN博客 解法&#xff1a; class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector…

2025最新源支付V7全套开源版+Mac云端+五合一云端

2025最新源支付V7全套开源版Mac云端五合一云端 官方1999元&#xff0c; 最新非网上那种功能不全带BUG开源版&#xff0c;可以自己增加授权或二开 拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题 它基于…

9 点结构模块(point.rs)

一、point.rs源码 use super::UnknownUnit; use crate::approxeq::ApproxEq; use crate::approxord::{max, min}; use crate::length::Length; use crate::num::*; use crate::scale::Scale; use crate::size::{Size2D, Size3D}; use crate::vector::{vec2, vec3, Vector2D, V…

数据分析系列--[12] RapidMiner辨别分析(含数据集)

一、数据准备 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 一、数据准备 点击下载数据集 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 Ending, congratulations, youre done.

Day33【AI思考】-函数求导过程 的优质工具和网站

文章目录 **函数求导过程** 的优质工具和网站**一、动态图形工具**1. **Desmos&#xff08;网页端&#xff09;**2. **GeoGebra&#xff08;全平台&#xff09;** **二、分步推导工具**3. **Wolfram Alpha&#xff08;网页/App&#xff09;**4. **Symbolab&#xff08;网页/App…

个人笔记(很没营养,纯备忘录)

1.输入电阻和输出电阻指在一个可划分为3部分的电路中&#xff0c;中间部分电路相当于前面电路的负载有输入端电阻&#xff0c;称输入电阻&#xff0c;相对于后面部分等效为电源有输出端内阻&#xff0c;称输出电阻 理所当然的希望输出电阻对负载影响小&#xff0c;输入电阻能完…

当卷积神经网络遇上AI编译器:TVM自动调优深度解析

从铜线到指令&#xff1a;硬件如何"消化"卷积 在深度学习的世界里&#xff0c;卷积层就像人体中的毛细血管——数量庞大且至关重要。但鲜有人知&#xff0c;一个简单的3x3卷积在CPU上的执行路径&#xff0c;堪比北京地铁线路图般复杂。 卷积的数学本质 对于输入张…

51单片机 02 独立按键

一、独立按键控制LED亮灭 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…

系统URL整合系列视频二(界面原型)

视频 系统URL整合系列视频二&#xff08;界面原型&#xff09; 视频介绍 &#xff08;全国&#xff09;大型分布式系统Web资源URL整合需求界面原型讲解。当今社会各行各业对软件系统的web资源访问权限控制越来越严格&#xff0c;控制粒度也越来越细。安全级别提高的同时也增加…