Python网络编程——静态Web服务器进阶版

简介: 可以返回请求的指定页面,没有请求的该文件,则返回404状态信息。

概述

可以返回请求的指定页面没有请求的该文件,则返回404状态信息。


实现步骤

1.导入socket、os包

importsocketimportos


2.创建tcp服务端套接字

tcp_server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)


3.绑定端口号

tcp_server_socket.bind(("", 8000))


4.设置监听

tcp_server_socket.listen(128)


5.等待接受客户端的连接请求

new_socket, ip_port=tcp_server_socket.accept()


6.接收客户端的请求信息

recv_data=new_socket.recv(4096)
# 判断接收的数据长度是否为0iflen(recv_data) ==0:
new_socket.close()
return


7.对二进制数据进行解码

recv_content=recv_data.decode("utf-8")
print(recv_content)


8.对数据按照空格进行分割

request_list=recv_content.split(" ", maxsplit=2)


9.获取请求的资源路径

request_path=request_list[1]
print(request_path)


10.判断请求的是否是根目录,如果是根目录设置返回的信息

ifrequest_path=="/":
request_path="/index.html"


11.报文处理

try:
# 打开文件读取文件中的数据, 提示:这里使用rb模式,兼容打开图片文件withopen("static"+request_path, "rb") asfile:  # 这里的file表示打开文件的对象file_data=file.read()
# 提示: with open 关闭文件这步操作不用程序员来完成,系统帮我们来完成exceptExceptionase:
# 代码执行到此,说明没有请求的该文件,返回404状态信息# 响应行response_line="HTTP/1.1 404 Not Found\r\n"# 响应头response_header="Server: PWS/1.0\r\n"# 读取404页面数据withopen("static/error.html", "rb") asfile:
file_data=file.read()
# 响应体response_body=file_data# 把数据封装成http 响应报文格式的数据response= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送给浏览器的响应报文数据new_socket.send(response)
else:
# 代码执行到此,说明文件存在,返回200状态信息# 响应行response_line="HTTP/1.1 200 OK\r\n"# 响应头response_header="Server: PWS/1.0\r\n"# 响应体response_body=file_data# 把数据封装成http 响应报文格式的数据response= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送给浏览器的响应报文数据new_socket.send(response)
finally:
# 关闭服务于客户端的套接字new_socket.close()


代码实现


importsocketimportosdefmain():
# 创建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(("", 8000))
# 设置监听tcp_server_socket.listen(128)
# 循环等待接受客户端的连接请求whileTrue:
# 等待接受客户端的连接请求new_socket, ip_port=tcp_server_socket.accept()
# 代码执行到此,说明连接建立成功# 接收客户端的请求信息recv_data=new_socket.recv(4096)
# 判断接收的数据长度是否为0iflen(recv_data) ==0:
new_socket.close()
return# 对二进制数据进行解码recv_content=recv_data.decode("utf-8")
print(recv_content)
# 对数据按照空格进行分割request_list=recv_content.split(" ", maxsplit=2)
# 获取请求的资源路径request_path=request_list[1]
print(request_path)
# 判断请求的是否是根目录,如果是根目录设置返回的信息ifrequest_path=="/":
request_path="/index.html"# 1. os.path.exits# os.path.exists("static/" + request_path)# 2. try-excepttry:
# 打开文件读取文件中的数据, 提示:这里使用rb模式,兼容打开图片文件withopen("static"+request_path, "rb") asfile:  # 这里的file表示打开文件的对象file_data=file.read()
# 提示: with open 关闭文件这步操作不用程序员来完成,系统帮我们来完成exceptExceptionase:
# 代码执行到此,说明没有请求的该文件,返回404状态信息# 响应行response_line="HTTP/1.1 404 Not Found\r\n"# 响应头response_header="Server: PWS/1.0\r\n"# 读取404页面数据withopen("static/error.html", "rb") asfile:
file_data=file.read()
# 响应体response_body=file_data# 把数据封装成http 响应报文格式的数据response= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送给浏览器的响应报文数据new_socket.send(response)
else:
# 代码执行到此,说明文件存在,返回200状态信息# 响应行response_line="HTTP/1.1 200 OK\r\n"# 响应头response_header="Server: PWS/1.0\r\n"# 响应体response_body=file_data# 把数据封装成http 响应报文格式的数据response= (response_line+response_header+"\r\n").encode("utf-8") +response_body# 发送给浏览器的响应报文数据new_socket.send(response)
finally:
# 关闭服务于客户端的套接字new_socket.close()
# 判断是否是主模块的代码if__name__=='__main__':
main()



目录
相关文章
|
4天前
|
监控 Linux 测试技术
LabVIEW网络服务器何使用,有哪些不同
LabVIEW网络服务器何使用,有哪些不同
|
2天前
|
存储 安全 数据安全/隐私保护
Web应用程序的会话管理是一种跟踪和识别特定用户与Web服务器之间交互的技术
【5月更文挑战第12天】Python Web开发中,会话管理用于跟踪用户与服务器交互,如Flask框架提供的内置功能。以下是一个简单示例:安装Flask后,设置应用密钥,通过session读写用户状态。例如,创建一个显示和设置用户名称的Web应用,用户提交的名字将保存在会话中。在生产环境中,应安全存储密钥,如使用环境变量。扩展会话管理可借助第三方库实现更多功能,但可能需更多配置。
8 2
|
2天前
|
网络协议
LabVIEW中如何在网络上使用远程VI服务器
LabVIEW中如何在网络上使用远程VI服务器
|
3天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
14 6
|
5天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
7天前
|
缓存 负载均衡 安全
深入探索Nginx高性能Web服务器配置与优化
【5月更文挑战第7天】本文深入探讨了Nginx的配置与优化,重点介绍了基础配置参数如`worker_processes`、`worker_connections`和`keepalive_timeout`,以及优化策略,包括使用epoll事件驱动模型、开启gzip压缩、启用缓存、负载均衡和安全配置。此外,还提到了性能调优工具,如ab、nginx-stats和nmon,以助于提升Nginx的性能和稳定性。
|
14天前
|
存储 数据处理 数据库
|
16天前
|
存储 缓存 网络协议
【专栏】理解并优化DNS设置对于提高网络速度至关重要
【4月更文挑战第28天】本文探讨了DNS服务器是否能加快网络访问速度。DNS负责将域名转换为IP地址,其查询时间、缓存机制和地理位置都影响网络速度。优化DNS配置,如选择快速的公共DNS服务、使用附近的服务器、确保设备正确配置和利用DNS缓存,都能有效提升网络体验。理解并优化DNS设置对于提高网络速度至关重要。
|
16天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
28 1
|
16天前
|
监控 负载均衡 网络协议