网络编程
位置:首页>> 网络编程>> Python编程>> python静态web服务器实现方法及代码详解

python静态web服务器实现方法及代码详解

作者:laozhang  发布时间:2023-01-13 17:17:12 

标签:python,静态,web服务器

1、编写TCP服务器程序。

2、获取浏览器发送的http请求消息数据。

3、读取固定的页面数据,将页面数据组装成HTTP响应消息数据并发送给浏览器。

4、HTTP响应报文数据发送完成后,关闭服务于客户端的套接字。

实例

# 时间: 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()

实例扩展:

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()

来源:https://www.py.cn/jishu/jichu/34528.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com