核心还是使用Python的socket实现的,socket的具体用法前面文章有写,这里不写太多注释。

1.本地搭建python静态web服务器

在资源目录打开命令终端,输入命令:python -m http.server [端口号],端口号不写默认8000即可

然后在浏览器输入localhost:8000/资源路径即可访问你想访问的页面

2.返回固定数据的静态web服务器

'''
返回固定数据的静态web服务器
'''
# 导入模块
import socket

# 创建socket对象
static_web_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
static_web_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) # 设置端口复用
static_web_server_socket.bind(('',7777))
static_web_server_socket.listen(128)

# 接收请求()
while True:
    client,ip_port=static_web_server_socket.accept()
    print(f'客户端{ip_port[0]}使用端口{ip_port[1]}连接成功...')
    # 接收客户端的请求信息
    request_data=client.recv(1024).decode('gbk')
    print(request_data)
    # 读取资源内容,无论客户端访问的哪个文件,返回的都是这个文件
    with open('static/index.html','rb') as file:
        file_content=file.read()    # 作为响应体
    # 响应行
    response_line='HTTP/1.1 200 OK\r\n'
    # 响应头
    response_header='Server: Tengine\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n'
    # 拼接相应报文(响应行+响应头+空行+响应体),需是二进制数据
    response_data=(response_line+response_header+'\r\n').encode('utf-8')+file_content
    # 发送报文
    client.send(response_data)
    # 关闭客户端连接
    client.close()
    print(f'客户端{ip_port[0]}关闭连接')

# 关闭服务器
static_web_server_socket.close()
print('Stop!')

3.返回指定数据的静态web服务器

'''
返回指定数据的静态web服务器
'''

import socket

def server_start(port):
    web_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    web_server.bind(('',port))
    web_server.listen(128)
    while True:
        client,ip_port=web_server.accept()
        print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
        request_info=client.recv(1024).decode('gbk')
        if len(request_info)==0:
            client.close()
            continue
        # print(request_info)
        resource_path=request_info.split()[1]
        print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
        if resource_path=='/':
            resource_path='index.html'
        try:
            with open(f'static/{resource_path}','rb') as f:
                response_body=f.read()
        except Exception as e:
            print('请求的文件不存在,请检查',e)
            with open('static/404.html','rb') as f:
                response_body=f.read()
            response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
        else:
            print('资源请求成功!')
            response_line='HTTP/1.1 200 OK'
        finally:
            response_header='Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
            response_data=(response_line+response_header+'\r\n').encode()+response_body
            client.send(response_data)
            client.close()

if __name__ == '__main__':
    server_start(7777)
    print('Stop')

4.多任务版静态web服务器

'''
多任务版静态web服务器
'''

import socket
import multiprocessing
import threading


def server_start(port):
    web_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    web_server.bind(('',port))
    web_server.listen(128)
    while True:
        client,ip_port=web_server.accept()
        # 多进程实现多任务
        # t=multiprocessing.Process(target=transit,args=(client,ip_port))
        # t.daemon=True
        # 多线程实现多任务
        t=threading.Thread(target=transit,args=(client,ip_port))
        t.setDaemon(True)
        t.start()
        # 多线程不写,但是多进程必须写
        # client.close()
    # 执行不到,不写也行
    web_server.close()


def transit(client,ip_port):
    print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
    request_info = client.recv(1024).decode('gbk')
    if len(request_info) == 0:
        print(f'{ip_port[0]}关闭了连接')
        client.close()

        return
    # print(request_info)
    resource_path = request_info.split()[1]
    print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
    if resource_path == '/':
        resource_path = 'index.html'
    try:
        with open(f'static/{resource_path}', 'rb') as f:
            response_body = f.read()
    except Exception as e:
        print('请求的文件不存在,请检查', e)
        with open('static/404.html', 'rb') as f:
            response_body = f.read()
        response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
    else:
        print('资源请求成功!')
        response_line = 'HTTP/1.1 200 OK'
    finally:
        response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
        response_data = (response_line + response_header + '\r\n').encode() + response_body
        client.send(response_data)
        client.close()

if __name__ == '__main__':
    server_start(7777)
    print('Stop')

5.多任务版静态web服务器(面向对象)

'''
多任务版静态web服务器(面向对象)
'''

import socket
# import multiprocessing
import threading

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

    def server_start(self):
        while True:
            client,ip_port=self.web_server.accept()
            # 多进程实现多任务
            # t=multiprocessing.Process(target=self.transit,args=(client,ip_port))
            # t.daemon=True

            # 多线程实现多任务
            t=threading.Thread(target=self.transit,args=(client,ip_port))
            t.setDaemon(True)
            t.start()
            # 多线程不写,但是多进程必须写
            # client.close()
        # 执行不到,不写也行
        self.web_server.close()

    def transit(self,client,ip_port):
        print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
        request_info = client.recv(1024).decode('gbk')
        if len(request_info) == 0:
            print(f'{ip_port[0]}关闭了连接')
            client.close()
            return
        # print(request_info)
        resource_path = request_info.split()[1]
        print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
        if resource_path == '/':
            resource_path = 'index.html'
        try:
            with open(f'static/{resource_path}', 'rb') as f:
                response_body = f.read()
        except Exception as e:
            print('请求的文件不存在,请检查', e)
            with open('static/error.html', 'rb') as f:
                response_body = f.read()
            response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
        else:
            print('资源请求成功!')
            response_line = 'HTTP/1.1 200 OK'
        finally:
            response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
            response_data = (response_line + response_header + '\r\n').encode() + response_body
            client.send(response_data)
            client.close()

if __name__ == '__main__':
    WebServer(7777).server_start()

6.多任务版静态web服务器(命令行传参)

格式:python(或python3) 文件名.py 参数

'''
多任务版静态web服务器(命令行传参)
python(或python3) 文件名.py 参数
'''

import socket
# import multiprocessing
import threading
import sys

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

    def server_start(self):
        while True:
            client,ip_port=self.web_server.accept()
            # 多进程实现多任务
            # t=multiprocessing.Process(target=self.transit,args=(client,ip_port))
            # t.daemon=True

            # 多线程实现多任务
            t=threading.Thread(target=self.transit,args=(client,ip_port))
            t.setDaemon(True)
            t.start()
            # 多线程不写,但是多进程必须写
            # client.close()
        # 执行不到,不写也行
        self.web_server.close()

    def transit(self,client,ip_port):
        print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
        request_info = client.recv(1024).decode('gbk')
        if len(request_info) == 0:
            print(f'{ip_port[0]}关闭了连接')
            client.close()
            return
        # print(request_info)
        resource_path = request_info.split()[1]
        print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
        if resource_path == '/':
            resource_path = 'index.html'
        try:
            with open(f'static/{resource_path}', 'rb') as f:
                response_body = f.read()
        except Exception as e:
            print('请求的文件不存在,请检查', e)
            with open('static/404.html', 'rb') as f:
                response_body = f.read()
            response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
        else:
            print('资源请求成功!')
            response_line = 'HTTP/1.1 200 OK'
        finally:
            response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
            response_data = (response_line + response_header + '\r\n').encode() + response_body
            client.send(response_data)
            client.close()

if __name__ == '__main__':
    if len(sys.argv)!=2:
        print('请输入python3 文件名.py 端口号')
    else:
        port=sys.argv[1]
        if port.isdigit():
            WebServer(int(port)).server_start()
        else:
            print('端口号必须为数字')