人工智能-Python网络编程-HTTP

用Python创建自己的HTTP服务器

方案一

HTTP-Python官方

python 复制代码
python -m http.server 80

方案二

HTTP-概念版

python 复制代码
import socket

IPV4_ADDR = '192.168.124.7'
IPV4_PORT = 8888


# TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序
class ServerSocket(object):
    def __init__(self):
        # 1 创建服务端套接字对象
        #   socket.AF_INET IPV4
        #   socket.SOCK_STREAM TCP
        #   socket.SOCK_DGRAM UDP
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 设置端口复用 如果程序执行结束,则让其占用的端口立即释放
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

        # 2 绑定端口号
        self.tcp_server_socket.bind((IPV4_ADDR, IPV4_PORT))

        # 3 设置监听
        # listen 后的套接字属于被动套接字,只负责接收新的客户端的连接请求不能收发消息
        #   参数为允许最大的连接数
        self.tcp_server_socket.listen(1)

    def start(self):
        while True:
            # 4 等待接收客户端的连接请求
            # 当 TCP 客户端程序和 TCP 服务端程序连接成功后,TCP 服务端程序会产生一个新的套接字,收发客户端消息使用该套接字
            client_socket, client_connect = self.tcp_server_socket.accept()

            # 5 接收数据
            recv_data = client_socket.recv(1024).decode(encoding='utf-8')
            # 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0
            if len(recv_data) <= 0:
                client_socket.close()

            # 截取到用户的访问请求参数
            request = recv_data.split(' ', maxsplit=2)[1]

            # 6 发送数据
            send_data = self.init_web_data(request)
            client_socket.send(send_data)

            client_socket.close()

    def __del__(self):
        # 5 关闭套接字
        self.tcp_server_socket.close()

    @staticmethod
    def init_web_data(request):
        if request == '/':
            request = '/index.html'
        file_path = './lanyue' + request

        # 解决 favicon.ico 或资源找不到的问题
        try:
            with open(file_path, "rb") as file:
                data = file.read()
        except:
            # HTML 标准样式为: 响应行 + 响应头 + 响应体 + 响应数据
            # 响应行
            response_line = "HTTP/1.1 404 NOT FOUND\r\n"
            # 响应体
            response_body = '资源不存在'.encode('utf-8')
        else:
            # HTML 标准样式为: 响应行 + 响应头 + 响应体 + 响应数据
            # 响应行
            response_line = "HTTP/1.1 200 OK\r\n"
            # 响应体
            response_body = data

        # 响应头
        response_header = "Server:PythonWeb1.0\r\n"

        # 响应数据
        response_data = (response_line + response_header + "\r\n").encode('utf-8') + response_body

        return response_data


if __name__ == '__main__':
    server_socket = ServerSocket()
    server_socket.start()
    

方案三

HTTP-FastApi版

安装依赖包
python 复制代码
pip install fastapi
pip install uvicorn

或

conda install fastapi
conda install uvicorn

或

pipenv install fastapi
pipenv install uvicorn
代码
python 复制代码
from fastapi import FastAPI
from fastapi import Response
import uvicorn

IPV4_ADDR = '192.168.124.7'
IPV4_PORT = 8888
app = FastAPI()


@app.get('/lanyue')
def index():
    # 读取要返回的文件内容
    with open('./lanyue/index.html', 'rb') as file:
        data = file.read()

    # 把data数据以text/html格式返回给浏览器端
    return Response(content=data, media_type='text/html')

uvicorn.run(app, host=IPV4_ADDR, port=IPV4_PORT)
相关推荐
IVEN_8 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang10 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮10 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling10 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮13 小时前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽13 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健1 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞1 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽1 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers