Python搭建静态Web服务器多线程版,面向对象版

多线程Web服务器搭建
import socket
import threading

def son(get_sock):
    # 接收数据  数据一定要接收
    ret = get_sock.recv(4096)

    # 完善:判断用户是否离开
    if len(ret) == 0:
        print('用户下线')
        get_sock.close()
        return

    # 解析请求报文,得到请求资源中的资源路径
    ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
    # 判断当/时候返回主页面
    if ret_road == '/':
        ret_road = '/index.html'

    try:
        # 响应报文和发送

        # 读取网页资源  rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
        file = open('./static' + ret_road, 'rb')
        body_data = file.read()
        file.close()

        # with open写法
        # with open('./static/index.html','rb')as file:
        #     body_data = file.read()
    except Exception as e:
        with open('./static/404.html', 'rb') as file:
            body_data = file.read()
        resp_data = 'HTTP/1.1 404 Not Found\r\nServer:HANYAN/1.1\r\n\r\n'
    else:
        resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
    finally:
        # 发送数据
        get_sock.send(resp_data.encode(encoding='gbk') + body_data)
        # 关闭
        get_sock.close()


def main():
    web_sock = socket.socket()
    web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
    web_sock.bind(('',9999))
    web_sock.listen(128)
    while True:
        #接收一个新的连接请求
        get_sock, get_adress = web_sock.accept()
        # print('用户%s 进入' % str(get_adress))
        thd = threading.Thread(target=son, args=(get_sock,))
        #设置守护主线程
        thd.setDaemon(True)
        thd.start()


if __name__ == '__main__':
    main()
面向对象版Web服务器搭建
 import socket
import threading



class Frame(object):
    def __init__(self):
        web_sock = socket.socket()
        web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        web_sock.bind(('', 9999))
        web_sock.listen(128)
        self.web_sock = web_sock

    def start(self):
        while True:
            # 接收一个新的连接请求
            get_sock, get_adress = self.web_sock.accept()
            print('用户%s 进入' % str(get_adress))
            thd = threading.Thread(target=self.son, args=(get_sock,))
            # 设置守护主线程
            thd.setDaemon(True)
            thd.start()

    @staticmethod
    def son(get_sock):
        # 接收数据  数据一定要接收
        ret = get_sock.recv(4096)

        # 完善:判断用户是否离开
        if len(ret) == 0:
            print('用户下线')
            get_sock.close()
            return

        # 解析请求报文,得到请求资源中的资源路径
        ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
        # 判断当/时候返回主页面
        if ret_road == '/':
            ret_road = '/index.html'

        try:
            # 响应报文和发送

            # 读取网页资源  rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
            file = open('./static' + ret_road, 'rb')
            body_data = file.read()
            file.close()

            # with open写法
            # with open('./static/index.html','rb')as file:
            #     body_data = file.read()
        except Exception as e:
            with open('./static/404.html', 'rb') as file:
                body_data = file.read()
            resp_data = 'HTTP/1.1 404 Not Found\r\nServer:HANYAN/1.1\r\n\r\n'
        else:
            resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
        finally:
            # 发送数据
            get_sock.send(resp_data.encode(encoding='gbk') + body_data)
            # 关闭
            get_sock.close()

def main():
    option = Frame()
    option.start()

if __name__ == '__main__':
    main()

承接上一篇Web服务器搭建,可以参考上篇对照就容易理解了。
https://blog.csdn.net/a1014825552/article/details/97293575

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值