Python网络编程——静态Web服务器面向对象

简介: 把Web服务器抽象成一个类,方法初始化,在初始化中建立套接字对线。提供一个开启Web服务器的方法,让Web服务器处理客户端的请求。

概述

把Web服务器抽象成一个类,方法初始化,在初始化中建立套接字对线。提供一个开启Web服务器的方法,让Web服务器处理客户端的请求。



实现步骤

1.定义web服务器类

初始化类

classHttpWebServer(object):
def__init__(self):
# 创建tcp服务端套接字tcp_server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用, 程序退出端口立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号tcp_server_socket.bind(("", 9000))
# 设置监听tcp_server_socket.listen(128)
# 保存创建成功的服务器套接字self.tcp_server_socket=tcp_server_socket


处理客户端请求

@staticmethoddefhandle_client_request(new_socket):
# 代码执行到此,说明连接建立成功recv_client_data=new_socket.recv(4096)
iflen(recv_client_data) ==0:
print("关闭浏览器了")
new_socket.close()
return# 对二进制数据进行解码recv_client_content=recv_client_data.decode("utf-8")
print(recv_client_content)
# 根据指定字符串进行分割, 最大分割次数指定2request_list=recv_client_content.split(" ", maxsplit=2)
# 获取请求资源路径request_path=request_list[1]
print(request_path)
# 判断请求的是否是根目录,如果条件成立,指定首页数据返回ifrequest_path=="/":
request_path="/index.html"try:
# 动态打开指定文件withopen("static"+request_path, "rb") asfile:
# 读取文件数据file_data=file.read()
exceptExceptionase:
# 请求资源不存在,返回404数据# 响应行response_line="HTTP/1.1 404 Not Found\r\n"# 响应头response_header="Server: PWS1.0\r\n"withopen("static/error.html", "rb") asfile:
file_data=file.read()
# 响应体response_body=file_data# 拼接响应报文response_data= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送数据new_socket.send(response_data)
else:
# 响应行response_line="HTTP/1.1 200 OK\r\n"# 响应头response_header="Server: PWS1.0\r\n"# 响应体response_body=file_data# 拼接响应报文response_data= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送数据new_socket.send(response_data)
finally:
# 关闭服务与客户端的套接字new_socket.close()


2.启动web服务器进行工作

defstart(self):
whileTrue:
# 等待接受客户端的连接请求new_socket, ip_port=self.tcp_server_socket.accept()
# 当客户端和服务器建立连接程,创建子线程sub_thread=threading.Thread(target=self.handle_client_request, args=(new_socket,))
# 设置守护主线程sub_thread.setDaemon(True)
# 启动子线程执行对应的任务sub_thread.start()


代码实现

importsocketimportthreading# 定义web服务器类classHttpWebServer(object):
def__init__(self):
# 创建tcp服务端套接字tcp_server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用, 程序退出端口立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号tcp_server_socket.bind(("", 9000))
# 设置监听tcp_server_socket.listen(128)
# 保存创建成功的服务器套接字self.tcp_server_socket=tcp_server_socket# 处理客户端的请求@staticmethoddefhandle_client_request(new_socket):
# 代码执行到此,说明连接建立成功recv_client_data=new_socket.recv(4096)
iflen(recv_client_data) ==0:
print("关闭浏览器了")
new_socket.close()
return# 对二进制数据进行解码recv_client_content=recv_client_data.decode("utf-8")
print(recv_client_content)
# 根据指定字符串进行分割, 最大分割次数指定2request_list=recv_client_content.split(" ", maxsplit=2)
# 获取请求资源路径request_path=request_list[1]
print(request_path)
# 判断请求的是否是根目录,如果条件成立,指定首页数据返回ifrequest_path=="/":
request_path="/index.html"try:
# 动态打开指定文件withopen("static"+request_path, "rb") asfile:
# 读取文件数据file_data=file.read()
exceptExceptionase:
# 请求资源不存在,返回404数据# 响应行response_line="HTTP/1.1 404 Not Found\r\n"# 响应头response_header="Server: PWS1.0\r\n"withopen("static/error.html", "rb") asfile:
file_data=file.read()
# 响应体response_body=file_data# 拼接响应报文response_data= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送数据new_socket.send(response_data)
else:
# 响应行response_line="HTTP/1.1 200 OK\r\n"# 响应头response_header="Server: PWS1.0\r\n"# 响应体response_body=file_data# 拼接响应报文response_data= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送数据new_socket.send(response_data)
finally:
# 关闭服务与客户端的套接字new_socket.close()
# 启动web服务器进行工作defstart(self):
whileTrue:
# 等待接受客户端的连接请求new_socket, ip_port=self.tcp_server_socket.accept()
# 当客户端和服务器建立连接程,创建子线程sub_thread=threading.Thread(target=self.handle_client_request, args=(new_socket,))
# 设置守护主线程sub_thread.setDaemon(True)
# 启动子线程执行对应的任务sub_thread.start()
# 程序入口函数defmain():
# 创建web服务器对象web_server=HttpWebServer()
# 启动web服务器进行工作web_server.start()
if__name__=='__main__':
main()
目录
相关文章
|
2月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
|
2月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
|
3月前
|
存储 运维 API
HPE OneView 10.0 - HPE 服务器、存储和网络设备集中管理软件
HPE OneView 10.0 - HPE 服务器、存储和网络设备集中管理软件
65 1
|
9天前
|
存储 弹性计算 网络协议
阿里云服务器ECS实例规格族是什么?不同规格CPU型号、处理器主频及网络性能参数均不同
阿里云ECS实例规格族是指具有不同性能特点和适用场景的实例类型集合。不同规格族如计算型c9i、通用算力型u1、经济型e等,在CPU型号、主频、网络性能、云盘IOPS等方面存在差异。即使CPU和内存配置相同,性能参数和价格也各不相同,适用于不同业务需求。
|
2月前
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
239 51
|
6月前
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
12天前
|
存储 监控 Linux
Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
22 0
|
2月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
62 4
|
4月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
100 15

热门文章

最新文章

推荐镜像

更多