python利用面向对象,协程开发web后端服务器

web后端入门级别!
开发语言:
python3
模块:
gevent os re socket

编辑器:
博主用的 vim

简介:
我们这里是利用了python最基础的知识来实现得网站后端,所以比较容易理解,代码里的”static”是博主本地的文件夹,文件夹内存放了一些html文件和图片,都可以通过ip+文件名来进行访问.

# 导入gevent的monkey模块,破解具有阻塞功能的方法
from gevent import monkey
monkey.patch_all()
import gevent
import os 
import re
import socket


class HTTPServer(object):
"""创建服务器类"""
    def __init__(self):
        # 创建套接字
        self.tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        # 设置端口重用
        self.tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        # 固定端口号
        self.tcp_socket.bind(("", 5566))
        # 转换为被动套接字
        self.tcp_socket.listen(128)


    def deal_request(self,client_socket):
        # 接受客户端请求
        data = client_socket.recv(4096)
        # 分割客户端请求行,请求头
        data_list = data.decode().split("\r\n")
        # 打印分割完成的列表
        print(data_list)
        # 匹配请求行内的请求路径
        match_str = re.match(r"\w+\s+(\S+)",data_list[0])
        # 通过分组获取请求路径
        match_str = match_str.group(1)
        # 如果为空直接关闭
        if not match_str:
            client_socket.close()
            print("请求错误")
            return
        # 如果为/默认转换为/index.html
        if match_str == "/":
            match_str = "/index.html"

        try:
            # 打开文件 读取内容 关闭文件
            file1 = open("static"+match_str,"rb")
            file_data = file1.read()
            file1.close()

        except:
            # 如果文件不存在服务器回复404
            response_line = "HTTP/1.1 404 NOT FOUND\r\n"
            response_header = "Server: bfe/1.0.8.13-sslpol-patch\r\n\r\n"
            response_body = response_line + response_header + "404错误"
            client_socket.sendall(response_body.encode("gbk"))
        else:
            # 如果文件存在回复200 并发送文件内容为响应体
            response_line = "HTTP/1.1 200 OK\r\n"
            response_header = "Server: bfe/1.0.8.13-sslpol-patch\r\n\r\n"
            response_body = response_line + response_header 
            client_socket.sendall(response_body.encode()+file_data)
        finally:
            # 关闭套接字
            client_socket.close()

    def run(self):
        while True:
            # 从等待队列中取出
            client_socket, client_ip = self.tcp_socket.accept()
            # 创建并启动套接字
            son = gevent.spawn(self.deal_request,client_socket)


def main():
    # 创建服务器类
    server = HTTPServer()
    server.run()


if __name__ == "__main__":
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值