人工智能-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)
相关推荐
云宏信息16 分钟前
【深度解析】VMware替代的关键一环:云宏ROW快照如何实现高频业务下的“无感”数据保护?
服务器·网络·数据库·架构·云计算·快照
我有一颗五叶草26 分钟前
HTTP 协议
网络·网络协议·http
新子y29 分钟前
【小白笔记】PyTorch 和 Python 基础的这些问题
pytorch·笔记·python
我是李武涯38 分钟前
PyTorch DataLoader 高级用法
人工智能·pytorch·python
Lynnxiaowen41 分钟前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
沐风ya1 小时前
RPC介绍
网络·网络协议·rpc
ThreeAu.1 小时前
pytest 实战:用例管理、插件技巧、断言详解
python·单元测试·pytest·测试开发工程师
OAFD.1 小时前
YOLOv3 详解:核心改进、网络架构与目标检测实践
网络·yolo·目标检测
资源补给站2 小时前
服务器高效操作指南:Python 环境退出与 Linux 终端快捷键全解析
linux·服务器·python
鹿鸣天涯2 小时前
商用密码应用安全性评估
网络·安全·web安全