一个简单的静态web服务器

用python的socket写的一个简单多进程服务器

#-*-coding:utf-8-*-
import re
from socket import *
from multiprocessing import Process

#设置静态文件根目录
HTTP_ROOT_DIR = "./html"

def fun(cli_socket):
    #接收数据
    request_data = cli_socket.recv(1024)
    #解析HTTP报文协议 request_data
    print("requst_data:",request_data)

    #处理响应数据
    request_lines = request_data.splitlines()
    print(request_lines)

    # 获取用户想要的请求名
    file_name = re.match(r"\w+ +(/[^ ]*) ",request_lines[0].encode("utf-8")).group(1)

    #判定一下特殊情况,字符串写在左侧可以避免把“==”写成“=”时当成赋值语句
    if "/" == file_name:
        file_name = "/index.html"
    # 打开请求文件
    try:
        f = open(HTTP_ROOT_DIR + file_name,"rb")
        file_data = f.read()
        f.close()
    except IOError:
        response_start_line = "HTTP/1.1 404 Not Found\r\n"
        response_header = "Server: My server\r\n"
        response_body = "Not Found"
    else:
        # 构造响应数据
        response_start_line = "HTTP/1.1 200 OK\r\n"
        response_header = "Server: My server\r\n"
        response_body = file_data.encode("utf-8")

    #拼接出要发送的字符串
    response = response_start_line + response_header + "\r\n" + response_body
    print("response data:",response)

    # 发送数据
    #cli_socket.send(bytes(response,"utf-8"))
    cli_socket.send(response)

    # 关闭套接字
    cli_socket.close()
    print("链接已经断开")

def main():
    #创建tcp套接字
    tcp_socket = socket(AF_INET,SOCK_STREAM)
    tcp_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    tcp_socket.bind(("",5566))
    tcp_socket.listen(5)

    #循环让服务器一直等待
    while True:
        try:
            #等待客户端连接
            cli_socket,addrs = tcp_socket.accept()
            print("%s  %s:用户已连接"%(addrs[0],addrs[1]))
            p = Process(target=fun,args=(cli_socket,))
            p.start()
            cli_socket.close()
        except:
            print("服务器已经关闭")
     
    tcp_socket.close()

if __name__ == '__main__':
    main()

结果截图

输入【本机地址:端口号】 ,得到准备好的index.html文件,这个index.html文件是新建的、

猜你喜欢

转载自blog.csdn.net/qq_38260497/article/details/88319995