# 终端进入要搭建的文件路径使用终端命令
python3 -m http.server # windows不需要python3直接用python就可以了
python3 -m http.server # 默认是8000端口
# 设置端口号
python3 -m http.server 8888

返回固定的页面

import socket


def handle_client_request(n_socket, client_ip_port):
    # 6. 接收信息(请求报文)
    buf = n_socket.recv(4096)  # buf 是请求报文
    if buf:
        print(buf.decode())
        # 7. 发送信息(响应报文)
        response_line = 'HTTP/1.1 200 OK\r\n'  # 响应行
        response_header = 'Server:PY\r\nName:py42\r\n'  # 响应头 空行\r\n
        f = open('static/index.html', 'rb')
        data = f.read()
        f.close()
        # 8.合成响应体
        response = (response_line + response_header + '\r\n').encode() + data
        n_socket.send(response)
        # 9. 关闭连接
        n_socket.close()
    else:
        print(f'{client_ip_port} 下线了')


if __name__ == '__main__':
    # 1. 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 3. 绑定IP和端口
    server_socket.bind(('', 8989))
    # 4. 设置监听
    server_socket.listen(128)
    # 5. 阻塞等待客户的链接
    while True:
        new_socket, ip_port = server_socket.accept()
        print(f'{ip_port}连接了')
        handle_client_request(new_socket, ip_port)

返回指定页面

import socket


def handle_client_request(n_socket, client_ip_port):
    # 6. 接收信息(请求报文)
    buf = n_socket.recv(4096)  # buf 是请求报文
    if buf:
        print(buf.decode())
        buf = buf.decode()
        file_name = buf.split(' ')[1]
        if file_name == '/':
            file_name = '/index.html'
        print(file_name)
        # 7. 发送信息(响应报文)
        response_line = 'HTTP/1.1 200 OK\r\n'  # 响应行
        response_header = 'Server:PY\r\nName:py42\r\n'  # 响应头 空行\r\n
        f = open('static' + file_name, 'rb')
        data = f.read()
        f.close()
        # 8.合成响应体
        response = (response_line + response_header + '\r\n').encode() + data
        n_socket.send(response)
        # 9. 关闭连接
        n_socket.close()
    else:
        print(f'{client_ip_port} 下线了')


if __name__ == '__main__':
    # 1. 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 3. 绑定IP和端口
    server_socket.bind(('', 8989))
    # 4. 设置监听
    server_socket.listen(128)
    # 5. 阻塞等待客户的链接
    while True:
        new_socket, ip_port = server_socket.accept()
        print(f'{ip_port}连接了')
        handle_client_request(new_socket, ip_port)

返回不存在的页面

import socket


def handle_client_request(n_socket, client_ip_port):
    # 6. 接收信息(请求报文)
    buf = n_socket.recv(4096)  # buf 是请求报文
    if buf:
        print(buf.decode())
        buf = buf.decode()
        file_name = buf.split(' ', 2)[1]
        if file_name == '/':
            file_name = '/index.html'
        print(file_name)
        # 7. 发送信息(响应报文)
        response_line = 'HTTP/1.1 200 OK\r\n'  # 响应行
        response_header = 'Server:PY\r\nName:py42\r\n'  # 响应头 空行\r\n
        try:
            f = open('static' + file_name, 'rb')
            data = f.read()
            f.close()
        except FileNotFoundError:
            f = open('static/error.html', 'rb')
            data = f.read()
            f.close()
            response_line = 'HTTP/1.1 404 NOT FOUND\r\n'  # 响应行
        # 8.合成响应体
        response = (response_line + response_header + '\r\n').encode() + data
        n_socket.send(response)
        # 9. 关闭连接
        n_socket.close()
    else:
        print(f'{client_ip_port} 下线了')


if __name__ == '__main__':
    # 1. 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 3. 绑定IP和端口
    server_socket.bind(('', 8989))
    # 4. 设置监听
    server_socket.listen(128)
    # 5. 阻塞等待客户的链接
    while True:
        new_socket, ip_port = server_socket.accept()
        print(f'{ip_port}连接了')
        handle_client_request(new_socket, ip_port)

多任务版本

import socket
import threading


def handle_client_request(n_socket, client_ip_port):
    # 6. 接收信息(请求报文)
    buf = n_socket.recv(4096)  # buf 是请求报文
    if buf:
        print(buf.decode())
        buf = buf.decode()
        file_name = buf.split(' ', 2)[1]
        if file_name == '/':
            file_name = '/index.html'
        print(file_name)
        # 7. 发送信息(响应报文)
        response_line = 'HTTP/1.1 200 OK\r\n'  # 响应行
        response_header = 'Server:PY\r\nName:py42\r\n'  # 响应头 空行\r\n
        try:
            f = open('static' + file_name, 'rb')
            data = f.read()
            f.close()
        except FileNotFoundError:
            f = open('static/error.html', 'rb')
            data = f.read()
            f.close()
            response_line = 'HTTP/1.1 404 NOT FOUND\r\n'  # 响应行
        # 8.合成响应体
        response = (response_line + response_header + '\r\n').encode() + data
        n_socket.send(response)
        # 9. 关闭连接
        n_socket.close()
    else:
        print(f'{client_ip_port} 下线了')


if __name__ == '__main__':
    # 1. 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 3. 绑定IP和端口
    server_socket.bind(('', 8989))
    # 4. 设置监听
    server_socket.listen(128)
    # 5. 阻塞等待客户的链接
    while True:
        new_socket, ip_port = server_socket.accept()
        print(f'{ip_port}连接了')
        sub_thread = threading.Thread(target=handle_client_request, args=(new_socket, ip_port))
        # handle_client_request(new_socket, ip_port)
        sub_thread.start()

面向对象版本

import socket
import threading


class HTTPWebServer(object):
    def __init__(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind(('', 9090))
        self.server_socket.listen(128)

    def __del__(self):
        self.server_socket.close()

    def start(self):
        while True:
            new_socket, ip_port = self.server_socket.accept()
            sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,ip_port))
            sub_thread.start()

    @staticmethod
    def handle_client_request(n_socket, client_ip_port):
        # 接收请求报文
        buf = n_socket.recv(4096)
        if buf:
            buf = buf.decode()
            # 解析资源路径
            file_name = buf.split(' ', 2)[1]
            if file_name == '/':
                file_name = '/index.html'
            # 发送信息
            response_line = 'HTTP/1.1 200 OK\r\n'
            response_header = 'Server:Python\r\nName:Python42\r\n'
            # 响应体
            try:
                f = open('static' + file_name, 'rb')
                data = f.read()
                f.close()
            except FileNotFoundError:
                f = open('static/error.html', 'rb')
                data = f.read()
                f.close()
                response_line = 'HTTP/1.1 404 NOT FOUND\r\n'

            # 合成响应体
            response = (response_line + response_header + '\r\n').encode() + data
            n_socket.send(response)
        else:
            print(f'{client_ip_port} 下线了.....')

        n_socket.close()


if __name__ == '__main__':
    # 创建服务器对象
    web = HTTPWebServer()
    # 启动服务
    web.start()

静态Web服务器-命令行启动版

"""
    -*- coding:utf-8 -*-
    Fille: 返回固定页面.py
    Software: PyCharm
    LoginName: mayanliang
    Author: Mayanliang
    Emali: mylgcs@163.com
    @Time: 2024/6/19 20:30 
"""
import socket
import threading
import sys

"""
命令       参数       参数
python3   xxx.py    9898
"""


class HTTPWebServer(object):
    def __init__(self, port):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.server_socket.bind(('', port))
        self.server_socket.listen(128)

    def __del__(self):
        self.server_socket.close()

    def start(self):
        while True:
            new_socket, ip_port = self.server_socket.accept()
            sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket, ip_port))
            sub_thread.start()

    @staticmethod
    def handle_client_request(n_socket, client_ip_port):
        # 接收请求报文
        buf = n_socket.recv(4096)
        if buf:
            buf = buf.decode()
            # 解析资源路径
            file_name = buf.split(' ', 2)[1]
            if file_name == '/':
                file_name = '/index.html'
            # 发送信息
            response_line = 'HTTP/1.1 200 OK\r\n'
            response_header = 'Server:Python\r\nName:Python42\r\n'
            # 响应体
            try:
                f = open('static' + file_name, 'rb')
                data = f.read()
                f.close()
            except FileNotFoundError:
                f = open('static/error.html', 'rb')
                data = f.read()
                f.close()
                response_line = 'HTTP/1.1 404 NOT FOUND\r\n'

            # 合成响应体
            response = (response_line + response_header + '\r\n').encode() + data
            n_socket.send(response)
        else:
            print(f'{client_ip_port} 下线了.....')

        n_socket.close()


if __name__ == '__main__':
    # 获取行命令行参数
    buf = sys.argv
    if len(buf) == 2:
        # 没有指定
        port = int(buf[1])
    else:
        port = 8888
    # 创建服务器对象
    web = HTTPWebServer(port)
    # 启动服务
    web.start()

results matching ""

    No results matching ""