栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python学习:web服务器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python学习:web服务器

1.返回固定页面数据:

import socket


if __name__ == '__main__':
    # 创建TCP服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server_socket.bind(("", 8000))  # 绑定端口号
    tcp_server_socket.listen(128)
    while True:   #
        new_socket, ip_port = tcp_server_socket.accept()
        recv_data = new_socket.recv(4096)   # 4kb左右
        print(recv_data)
        with open("static/index.jpg", "r") as file:   # 关闭文件操作不用自己完成,file是文件
            file_data = file.read()

        response_line = "HTTP/1.1 200 OKrn"
        response_header = "Server: PWS/1.0rn"
        response_body = file_data
        response = response_line + response_header + "rn" + response_body
        response_data = response.encode("utf-8")
        new_socket.send(response_data)

        new_socket.close()

2.返回指定页面数据:

import socket


def main():
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server_socket.bind(("", 8000))  # 绑定端口号
    tcp_server_socket.listen(128)
    while True:  #
        new_socket, ip_port = tcp_server_socket.accept()
        recv_data = new_socket.recv(4096)  # 4kb左右
        if len(recv_data == 0):
            new_socket.close()
            return

        # jiema
        recv_content = recv_data.decode("utf-8")
        print(recv_content)
        request_list = recv_content.split(" ", maxsplit=2)  # 对数据按照空格进行分割
        request_path = request_list[1]  # 获取请求资源路径
        print(request_path)

        if request_path == "/":  # 判断请求的是否是根目录
            request_path = "/index.html"

        with open("static" + request_path, "rb") as file:  # 关闭文件操作不用自己完成,file是文件,
            # rb可读图片,兼容文本
            file_data = file.read()

        response_line = "HTTP/1.1 200 OKrn"
        response_header = "Server: PWS/1.0rn"
        response_body = file_data  # 二进制
        response = (response_line + response_header + "rn").encode("utf-8") + response_body
        new_socket.send(response)

        new_socket.close()

        
if __name__ == '__main__':
    main()

3.返回404页面:

import socket


def main():
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server_socket.bind(("", 8000))  # 绑定端口号
    tcp_server_socket.listen(128)
    while True:  #
        new_socket, ip_port = tcp_server_socket.accept()
        recv_data = new_socket.recv(4096)  # 4kb左右
        if len(recv_data == 0):
            new_socket.close()
            return

        # 解码
        recv_content = recv_data.decode("utf-8")
        print(recv_content)
        request_list = recv_content.split(" ", maxsplit=2)  # 对数据按照空格进行分割
        request_path = request_list[1]  # 获取请求资源路径
        print(request_path)

        if request_path == "/":  # 判断请求的是否是根目录
            request_path = "/index.html"

        # os.path.exists("static/"+request_path)

        try:
            with open("static" + request_path, "rb") as file:  # 关闭文件操作不用自己完成,file是文件,# rb可读图片,兼容文本
                file_data = file.read()
        except Exception as e:
            response_line = "HTTP/1.1 404 Not Fonudrn"
            response_header = "Server: PWS/1.0rn"
            with open("static/error.html", "rb") as file:
                file_data = file.read()
                response_body = file_data  # 二进制
                response = (response_line + response_header + "rn").encode("utf-8") + response_body
        else:
            response_line = "HTTP/1.1 200 OKrn"
            response_header = "Server: PWS/1.0rn"
            response_body = file_data  # 二进制
            response = (response_line + response_header + "rn").encode("utf-8") + response_body
            new_socket.send(response)
        finally:
            new_socket.close()


if __name__ == '__main__':
    main()

4.多任务版本:

import socket
import threading


def handle_client_request(new_socket):
    recv_data = new_socket.recv(4096)  # 4kb左右
    if len(recv_data == 0):
        new_socket.close()
        return

    # 解码
    recv_content = recv_data.decode("utf-8")
    print(recv_content)
    request_list = recv_content.split(" ", maxsplit=2)  # 对数据按照空格进行分割
    request_path = request_list[1]  # 获取请求资源路径
    print(request_path)

    if request_path == "/":  # 判断请求的是否是根目录
        request_path = "/index.html"

    # os.path.exists("static/"+request_path)

    try:
        with open("static" + request_path, "rb") as file:  # 关闭文件操作不用自己完成,file是文件,# rb可读图片,兼容文本
            file_data = file.read()
    except Exception as e:
        response_line = "HTTP/1.1 404 Not Fonudrn"
        response_header = "Server: PWS/1.0rn"
        with open("static/error.html", "rb") as file:
            file_data = file.read()
            response_body = file_data  # 二进制
            response = (response_line + response_header + "rn").encode("utf-8") + response_body
    else:
        response_line = "HTTP/1.1 200 OKrn"
        response_header = "Server: PWS/1.0rn"
        response_body = file_data  # 二进制
        response = (response_line + response_header + "rn").encode("utf-8") + response_body
        new_socket.send(response)
    finally:
        new_socket.close()


def main():
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server_socket.bind(("", 8000))  # 绑定端口号
    tcp_server_socket.listen(128)
    while True:  #
        new_socket, ip_port = tcp_server_socket.accept()

        sub_thread = threading.Thread(target=handle_client_request, args={new_socket})
        # 设置成为守护主线程
        sub_thread.setDaemon(True)
        sub_thread.start()


if __name__ == '__main__':
    main()

5.面向对象版,动态绑定端口号:

import socket
import threading
import sys


class HttpWebServer(object):
    def __init__(self, port):
        tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        tcp_server_socket.bind(("", port))  # 绑定端口号
        tcp_server_socket.listen(128)
        # 把套接字变成属性
        self.tcp_server_socket = tcp_server_socket

    @staticmethod
    def handle_client_request(new_socket):   # 用不到当前对象和当前类,静态方法
        recv_data = new_socket.recv(4096)  # 4kb左右
        if len(recv_data == 0):
            new_socket.close()
            return

        # 解码
        recv_content = recv_data.decode("utf-8")
        print(recv_content)
        request_list = recv_content.split(" ", maxsplit=2)  # 对数据按照空格进行分割
        request_path = request_list[1]  # 获取请求资源路径
        print(request_path)

        if request_path == "/":  # 判断请求的是否是根目录
            request_path = "/index.html"

        # os.path.exists("static/"+request_path)

        try:
            with open("static" + request_path, "rb") as file:  # 关闭文件操作不用自己完成,file是文件,# rb可读图片,兼容文本
                file_data = file.read()
        except Exception as e:
            response_line = "HTTP/1.1 404 Not Fonudrn"
            response_header = "Server: PWS/1.0rn"
            with open("static/error.html", "rb") as file:
                file_data = file.read()
                response_body = file_data  # 二进制
                response = (response_line + response_header + "rn").encode("utf-8") + response_body
        else:
            response_line = "HTTP/1.1 200 OKrn"
            response_header = "Server: PWS/1.0rn"
            response_body = file_data  # 二进制
            response = (response_line + response_header + "rn").encode("utf-8") + response_body
            new_socket.send(response)
        finally:
            new_socket.close()

    def start(self):
        while True:  #
            new_socket, ip_port = self.tcp_server_socket.accept()

            sub_thread = threading.Thread(target=self.handle_client_request, args={new_socket})
            # 设置成为守护主线程
            sub_thread.setDaemon(True)
            sub_thread.start()


def main():
    # 获取终端命令行参数
    params = sys.argv
    if len(params) != 2:
        print("执行的命令格式如下:python xxx.py 9000")
        return
    print(params)

    # 判断第二个参数是否都是由数字组成
    if not params[1].isdight():     # "".isdight()
        print("执行的命令格式如下:python xxx.py 9000")
        return
    port = int(params[1])

    web_server = HttpWebServer(port)
    web_server.start()


if __name__ == '__main__':
    main()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/350324.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号