本地模拟搭建静态网站服务器,以及客户端发起下载请求

        类似微信小程序、云存储、云盘这类应用跟静态网站服务器非常类似。通过这个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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CCSBRIDGE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值