类似微信小程序、云存储、云盘这类应用跟静态网站服务器非常类似。通过这个Demo可以大概了解他们的基本原理。
静态网站服务器:
import http.server
import socketserver
import urllib
import os
import logging
import socket
# 将服务器的当前目录更改为指定的路径
os.chdir(r"C:\Users\MarkDeng\Desktop\MyUnityGame\WmG\webgl")
# 在全局范围内配置日志
logging.basicConfig(filename='server.log', level=logging.ERROR)
# 敏感文件列表
sensitive_files = ("config.txt", "passwords.txt") # 敏感文件元组
# 设置本地文件夹路径和端口号
resource_directory = r"C:\Users\MarkDeng\Desktop\MyUnityGame\WmG\webgl"
port = 8080
class CustomRequestHandler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.directory = resource_directory # 设置根目录为 resource_directory
# 调用父类的 __init__ 方法,确保属性被正确初始化
self.should_terminate_recursive_function = False
self.base_directory = r"C:\Users\MarkDeng\Desktop\MyUnityGame\WmG\webgl"
self.requested_file = urllib.parse.unquote(self.path)
self.requested_file_path = os.path.abspath(os.path.normpath(os.path.join(self.base_directory, self.requested_file)))
if not self.should_terminate_recursive_function:
if not self.requested_file_path.startswith(self.base_directory):
# 请求的文件路径不在预期的文件夹内,可以返回错误响应或拒绝请求
self.should_terminate_recursive_function = True
return
if os.path.basename(self.requested_file) in sensitive_files:
# 请求了敏感文件,可以返回错误响应或拒绝请求
self.should_terminate_recursive_function = True
return
else:
self.connection.shutdown(socket.SHUT_RDWR)
def end_headers(self):
print("Request URL:", self.path) # 输出请求的URL
super().end_headers()
class ThreadedHTTPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
# 创建自定义请求处理程序
Handler = CustomRequestHandler
# 使用ThreadedHTTPServer启动多线程服务器
httpd = ThreadedHTTPServer(("", port), Handler)
print("本地服务器正在监听端口", port)
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("收到中断信号,关闭服务器")
httpd.shutdown()
except Exception as e:
print("发生错误:", e)
logging.error("发生错误: %s", e)
import traceback
print(traceback.format_exc())
httpd.shutdown()
客户端:
import urllib.request
server_address = r"http://localhost:8080/" # 服务器地址,包括端口号
# file_to_download = r"C:/Users/MarkDeng/Desktop/MyUnityGame/WmG/webgl/7fe90e4016ec61e5.webgl.data.unityweb.bin.txt"
file_to_download = "7fe90e4016ec61e5.webgl.data.unityweb.bin.txt"
url = f"{server_address}/{file_to_download}"
urllib.request.urlretrieve(url, file_to_download)
try:
# 构造下载链接
download_url = server_address + file_to_download
# 发起HTTP GET请求下载文件
with urllib.request.urlopen(download_url) as response:
# 读取文件内容
file_content = response.read()
# 将文件内容保存到本地
with open("downloaded_file.txt", "wb") as local_file:
local_file.write(file_content)
print("文件下载完成!")
except Exception as e:
print("下载文件时发生错误:", e)