【从零学习python 】87. 手动搭建HTTP服务器的Python实现及多线程并发处理

简介: 【从零学习python 】87. 手动搭建HTTP服务器的Python实现及多线程并发处理

导入必要的模块

import re
import socket
from multiprocessing import Process

我们导入了re模块用于正则表达式操作,socket模块用于网络通信,以及multiprocessing模块中的Process类用于创建子进程

定义WSGIServer类

class WSGIServer():
    def __init__(self, server, port, root):
        self.server = server
        self.port = port
        self.root = root
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_socket.bind((self.server, self.port))
        self.server_socket.listen(128)

在类的初始化方法__init__中,我们传入了服务器地址server、端口号port和根目录root作为参数,然后创建了一个socket对象server_socket,并设置了一些属性。我们通过bind方法将服务器地址和端口号绑定到server_socket上,并调用listen方法监听连接请求。

处理客户端请求

def handle_socket(self, socket):
    data = socket.recv(1024).decode('utf-8').splitlines()[0]
    file_name = re.match(r'[^/]+(/[^ ]*)', data)[1]
    if file_name == '/':
        file_name = self.root + '/index.html'
    else:
        file_name = self.root + file_name
    try:
        file = open(file_name, 'rb')
    except IOError:
        response_header = 'HTTP/1.1 404 NOT FOUND \r\n'
        response_header += '\r\n'
        response_body = '========Sorry,file not found======='.encode('utf-8')
    else:
        response_header = 'HTTP/1.1 200 OK \r\n'
        response_header += '\r\n'
        response_body = file.read()
    finally:
        socket.send(response_header.encode('utf-8'))
        socket.send(response_body)

接下来定义了一个handle_socket方法,用于处理客户端发来的请求。首先,我们通过socket.recv方法接收请求数据,并对数据进行解码。然后,使用正则表达式从请求数据中提取出文件名。如果文件名为根目录’/',我们将其设置为根目录下的’index.html’文件,否则拼接上根目录路径。然后,尝试打开对应的文件,如果文件不存在,我们返回404状态码和错误提示信息;如果文件存在,我们返回200状态码和文件内容作为响应体。

最后,我们通过finally块使用socket.send方法将响应头和响应体发送给客户端。

持续监听连接请求

def forever_run(self):
    while True:
        client_socket, client_addr = self.server_socket.accept()
        p = Process(target=self.handle_socket, args=(client_socket,))
        p.start()
        client_socket.close()

在WSGIServer类中,定义了一个forever_run方法,用于持续监听连接请求。在循环中,我们使用accept方法接受客户端的连接请求,并创建一个子进程Process去处理连接请求,以实现多线程并发处理。然后关闭客户端套接字。

主程序入口

if __name__ == '__main__':
    ip = '0.0.0.0'
    port = 8899
    server = WSGIServer(ip, port, './pages')
    print('server is running at {}:{}'.format(ip, port))
    server.forever_run()

在主程序中,我们实例化了WSGIServer类,并传入服务器地址、端口号和根目录的参数。然后打印出服务器运行的信息,最后调用forever_run方法开始监听连接请求。

相关文章
|
5月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
1237 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
4月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
942 1
|
6月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
328 18
|
6月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
373 14
|
5月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
5月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
1201 0
|
5月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
436 0
|
弹性计算 C语言 容器
云服务器EC云上开发学习体验
简述通过老师引导,自己学习体验个人简历网页的设计以及在这一过程遇到的一些小问题,最后是一些感悟与成长。
云服务器EC云上开发学习体验
|
弹性计算 编译器 开发工具
ECS给线上学习带来的全新体验
本文介绍了作者在学习面向对象编程基础这门课程时借助ECS的高效性与便利性大大提升了学习效率的学习经验,以及在使用ECS完成课程任务时的心得与体验,也表达了作者对阿里云平台为学生提供这一优秀的教学资源的感谢。
|
弹性计算 Linux
云服务器学习体验
在课堂上我们了解到了ECS云服务器的相关用途及优点便捷处,为了更好的认识和掌握云服务器的用法,在教程的帮助下,我使用阿里云的云服务器创建了Linux云系统,在LAMP的环境下制作了个人简历网站,对操作系统、云、网页制作等有了更深刻的了解。

推荐镜像

更多