使用py实现一个简单的html服务器


# 一个 web 服务器,应 《计算机网络》 要求

import os
from socket import AF_INET, SOCK_STREAM, socket
from typing import List, Generator

import magic

server_name = 'Computer_Network'
server_port = 12000


def get_response(req: str) -> Generator[bytes, None, None]:
    if len(req) == 0:
        return None
    file_addr: str = req.splitlines()[0].split(' ')[1].replace('/', 'static\\')
    file_content: bytes = bytes()
    not_found: bool = False
    print("请求的地址:", file_addr)
    if file_addr == 'static\\':
        file_addr = 'static\\index.html'
    # 判断文件是否存在并读入文件
    if not os.path.exists(file_addr):
        not_found = True
    else:
        with open(file_addr, 'rb') as f:
            file_content = f.read()
    # 构建响应头
    http_ver: str = req.splitlines()[0].split(' ')[2].lstrip()  # 获取 HTTP 版本
    status_code: str = "404 Not Found" if not_found else "200 OK"
    data_length = len(file_content)
    mime_type: str = ''
    # 判断文件 mime 类型
    if os.path.exists(file_addr):
        mime_type = str(magic.from_file(file_addr, mime=True))
    # 格式化响应头
    response_head: str = \
        "%s %s\r\n" \
        "Connection:keep-alive\r\n" \
        "Content-Length:%d\r\n" \
        "Content-Type:%s\r\n" \
        "\r\n" % (http_ver, status_code, data_length, mime_type)
    print("响应头:", response_head)
    # 分批发送数据
    all_data: bytes = response_head.encode("utf-8") + file_content
    i: int = 0
    MCU = 1024  # TCP 链路 MUC
    while (i < len(file_content)):
        data: bytes = all_data[i:(i+MCU)]
        i += MCU
        yield data


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    server_socket = socket(AF_INET, SOCK_STREAM)
    server_socket.bind(('', server_port))
    server_socket.listen(1)
    print("服务器已经开始运行")
    # 开始监听并获取套接字
    while True:
        connected_socket, addr = server_socket.accept()
        req = connected_socket.recv(1024).decode()
        print('请求头:', req)
        print('\n')
        print("本次发送数据的大小:", end=" ")
        for data in get_response(req):
            print(len(data), end=' ')
            connected_socket.send(data)
        print('\n')
        connected_socket.close()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值