Python高级——Web静态服务器(面向对象)

功能:用户访问服务器可以返回指定页面
步骤:
1.创建服务器类
2.创建初始化服务器配置方法
3.创建接收客户端请求的方法
4.创建发送响应报文给客户端方法

import socket
import re
import multiprocessing


# Http服务器类
class HttpServer:
    # 初始化属性
    def __init__(self):
        # 创建套接字
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置地址重用
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 绑定端口
        self.tcp_server_socket.bind(("", 8080))
        # 设置监听,最多建立128个连接
        self.tcp_server_socket.listen(128)

    def start(self):
        while True:
            # 接收客户端信息
            client_socket, ip_port = self.tcp_server_socket.accept()
            print('新用户:', ip_port, '已连接')
            # 创建新进程,给客户端返回响应报文
            t1 = multiprocessing.Process(target=self.recv_msg, args=(client_socket, ip_port))
            # 启动进程
            t1.start()
            # 关闭客户端套接字(多进程不共享资源,故先后需要关闭两次套接字)
            client_socket.close()

    # 发送消息方法
    @staticmethod
    def recv_msg(client_socket, ip_port):
        # 接收客户端请求报文
        client_text = client_socket.recv(1024)
        if not client_text:
            print("客户端", ip_port, "已下线")
            client_socket.close()
            return
        # 请求报文解码
        client_text_str = client_text.decode()
        print(client_text_str)
        # 将请求报文切割
        client_list = client_text_str.split("\r\n")
        # 正则匹配出请求路径
        ret = re.search(r"\s(.*)\s", client_list[0])
        print(ret.group())
        # 匹配不到则请求报文错误
        if not ret:
            print("用户请求报文格式错误!")
            client_socket.close()
            return
        # 得到路径
        path_info = ret.group(1)
        # 设置默认路径
        if path_info == '/':
            path_info = '/index.html'
        print("接收到用户请求:", path_info)
        # 响应头
        response_header = "Server:Python-Web1.0\r\n"
        # 响应空行
        response_blank = "\r\n"
        try:
            # 读取指定路径文件,并且返回
            with open('web'+path_info, "rb") as file:
                # 读取文件的二进制数据
                response_content = file.read()
        # 找不到路径则返回404错误
        except Exception as e:
            # 开始拼接响应数据
            response_line = "HTTP/1.1 404 Not Found\r\n"
            response_content = "Error !!! %s" % str(e)
            response_content = response_content.encode()
        else:
            # 开始拼接响应数据
            response_line = "HTTP/1.1 200 OK\r\n"
        # 拼接响应头
        response_data = (response_line + response_header + response_blank).encode() + response_content
        # 发送数据
        client_socket.send(response_data)
        # 关闭socket
        client_socket.close()


if __name__ == '__main__':
    http1 = HttpServer()
    http1.start()

直接结果:可以正确的返回客户端请求的页面
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值