人工智能-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)
相关推荐
清水白石00810 分钟前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
山海青风14 分钟前
图像识别零基础实战入门 1 计算机如何“看”一张图片
图像处理·python
chilavert31829 分钟前
技术演进中的开发沉思-302计算机原理:网络基础
网络·计算机原理
Hellc00739 分钟前
Docker网络冲突排查与解决方案:完整指南
网络·docker·容器
彼岸花开了吗42 分钟前
构建AI智能体:八十、SVD知识整理与降维:从数据混沌到语义秩序的智能转换
人工智能·python·llm
山土成旧客1 小时前
【Python学习打卡-Day40】从“能跑就行”到“工程标准”:PyTorch训练与测试的规范化写法
pytorch·python·学习
眠りたいです1 小时前
Docker核心技术和实现原理第二部分:docker镜像与网络原理
运维·网络·docker·容器
ps酷教程1 小时前
HttpPostRequestDecoder源码浅析
java·http·netty
闲人编程1 小时前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器
Xの哲學1 小时前
Linux Platform驱动深度剖析: 从设计思想到实战解析
linux·服务器·网络·算法·边缘计算