Python实现静态Web服务器:从TCP连接到HTTP响应详解
本文详细解析使用Python实现静态Web服务器的核心步骤,涵盖TCP服务端创建、HTTP请求解析、响应报文组装及文件读取逻辑。通过具体代码示例,展示如何绑定端口、监听连接、处理GET请求并返回HTML内容,帮助开发者深入理解Web服务器底层通信机制。
静态Web服务器核心流程解析
首先,需要编写基础的TCP服务器程序,这是实现Web服务的前提。
其次,程序需具备接收并解析浏览器发送的HTTP请求消息数据的能力,以识别客户端的具体需求。
接着,服务器应读取预设的静态页面文件,将其内容组装成符合HTTP标准的响应消息数据,并发送给浏览器客户端。
最后,在HTTP响应报文数据成功发送完毕后,必须关闭与当前客户端连接的套接字,以释放资源并结束本次会话。
以下是具体的代码实现示例,展示了从服务器创建到请求处理的完整流程。
基础TCP服务器代码实现
# 时间: 2021/10/21 20:38
import socket
if __name__ == '__main__':
# 创建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(("", 8080))
# 设置监听
tcp_server_socket.listen(128)
while True:
# 等待接受客户端的连接请求
new_socket, ip_port = tcp_server_socket.accept()
# 代码执行到此,说明连接建立成功
recv_client_data = new_socket.recv(4096)
# 对二进制数据进行解码
recv_client_content = recv_client_data.decode)
print(recv_client_content)
# 响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 响应头
response_header = "Server: py1.0\r\n"
# 响应体
response_body = "Hello,guys!"
# 拼接响应报文
response_data = (response_line + response_header + "\r\n"+ response_body).encode()
# 发送数据
new_socket.send(response_data)
# 关闭服务与客户端的套接字
new_socket.close()此外,还可以对代码进行扩展,例如增加对特定文件类型的处理或优化并发性能,以增强服务器的实用性。
HTTP请求处理与文件服务扩展
import socket
import re
import time
def service_client(new_socket):
"""为这个客户端服务"""
# 1.接收浏览器发送过来的请求,即http请求
# GET / HTTP/1.1
# --------
request = new_socket.recv(1024).decode('utf-8')
# 判断客户端意外断开链接返回空字符串
if not request:
# 关闭套接字并退出
new_socket.close()
print("==="*30)
return
# 分隔套接字
request_lines = request.splitlines()
print()
print(">"*20)
print(request_lines)
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html"
# 2.返回http格式数据 给浏览器
try:
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "Content-Type:text/html;charset=utf-8\r\n"
response += "\r\n"
response += "<h1>404 not found <br> 没有发现所请求资源</h1>"
response += str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
new_socket.send(response.encode('utf-8'))
else:
html_content = f.read()
f.close()
# 2.1准备发送给浏览器的数据---header
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
# 2.2准备发送给浏览器的数据 ---body
# 将response header发送给浏览器
new_socket.send(response.encode("utf-8"))
# 将response body发送给浏览器
new_socket.send(html_content)
# 关闭套接字
new_socket.close()
def main():
"""用来完成整体的控制"""
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定
tcp_server_socket.bind(("", 7890))
# 3.变为套接字
tcp_server_socket.listen(128)
while True:
# 4.等待客户端的链接
new_socket, client_addr = tcp_server_socket.accept()
print(client_addr)
# 5.为这个客户端服务
service_client(new_socket)
# 关闭监听套接字
tcp_server_socket.close()
if __name__ == '__main__':
main()至此,关于Python静态Web服务器的实现方法及代码详解已介绍完毕。如需了解更多相关技术内容,建议查阅本站过往文章或持续关注后续更新,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









