静态web服务器

本文介绍了如何使用Python创建静态Web服务器,包括设置套接字、绑定端口、监听连接、解析HTTP请求并根据路径返回相应文件。讲解了从接收请求到响应HTML页面的完整流程,以及面向对象和多线程的实现方式。
摘要由CSDN通过智能技术生成

创建静态web服务器

①:打开终端

②:进到静态服务器文件夹

③:输入命令:python -m http.server 8080

④:在游览器中查看:127.0.0.1:8080

用Python代码实现:

import socket
#1.创建套接字对象
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#为了让绑定端口在服务断开后可以迅速释放,建议设置端口复用
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

#2.绑定Ip和端口(注意:参数比较特殊,要求是一个元组)
#绑定的ip地址可以不写,代表本机ip地址
tcp_server.bind(('',8080))

#3.开始监听
tcp_server.listen(128)#listen()的参数代表最多处理128个客户端
while True:
    #4.准备接受客户端连接请求,产生新的套接字对象
    conn_socket,ip_port=tcp_server.accept()#tcp_server.accept()返回元组,一个是新的套接字对象,和客户端信息

    #5、接受客户端信息发送过来的HTTP请求
    recv_client_data=conn_socket.recv(4096)
    #6.解析数据:
    if len(recv_client_data)>0:
        recv_client_connt=recv_client_data.decode('utf-8')
        print(recv_client_connt)
        #7.返回HTTP响应给客户端游览器(1-响应行 2-响应头 3-空行 4-响应体)
        #① 打开static目录下的index.html文件
        with open('static/index.html','rb') as f:
            file_data=f.read()
        #② 响应行
        response_line='HTTP/1.1 200 ok\r\n'
        #③ 响应头
        response_header='Server:PWB1.0\r\n'
        #④ 响应体
        response_body=file_data
        #⑤ 响应数据
        response_data=(response_line+response_header+'\r\n').encode('utf-8')+file_data
        #发送数据
        conn_socket.send(response_data)
    conn_socket.close()

创建web服务器返回指定页面:

# 开发人:龙技术
# 个人训练
# 开发时间:2021/8/13 16:16
import socket
#1.创建套接字对象
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#为了让绑定端口在服务断开后可以迅速释放,建议设置端口复用
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

#2.绑定Ip和端口(注意:参数比较特殊,要求是一个元组)
#绑定的ip地址可以不写,代表本机ip地址
tcp_server.bind(('192.168.15.28',8080))

#3.开始监听
tcp_server.listen(128)#listen()的参数代表最多处理128个客户端
while True:
    #4.准备接受客户端连接请求,产生新的套接字对象
    conn_socket,ip_port=tcp_server.accept()#tcp_server.accept()返回元组,一个是新的套接字对象,和客户端信息

    #5、接受客户端信息发送过来的HTTP请求
    recv_client_data=conn_socket.recv(4096)
    #6.解析数据:
    if len(recv_client_data)>0:
        recv_client_connt=recv_client_data.decode('utf-8')
        print(recv_client_connt)
        response_lj=recv_client_connt.split(' ',maxsplit=2)[1]
        print(response_lj)
        if response_lj=='/':
            lj='static/index.html'
        else:
            lj='static'+response_lj
        #7.返回HTTP响应给客户端游览器(1-响应行 2-响应头 3-空行 4-响应体)
        #① 打开static目录下的index.html文件
        try:
            with open(lj,'rb') as f:
                file_data=f.read()
        except Exception as e:
            with open('static/error.html','rb') as f:
                file_data=f.read()
            #如果文件不存在,则返回HTTP、1.1 404 Not Found
            # ② 响应行
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            # ③ 响应头
            response_header = 'Server:PWB1.0\r\n'
            # 中文乱码解救方案:
            # response_header = 'Server:PWB1.0\r\nContent-type:text/html; charset=utf-8\r\n'

            # ④ 响应体
            response_body = file_data
            # ⑤ 响应数据
            response_data = (response_line + response_header + '\r\n').encode('utf-8') + file_data
            # 发送数据
            conn_socket.send(response_data)
        else:
            #② 响应行
            response_line='HTTP/1.1 200 ok\r\n'
            #③ 响应头
            response_header='Server:PWB1.0\r\n'
            #中文乱码解救方案:
            #response_header = 'Server:PWB1.0\r\nContent-type:text/html; charset=utf-8\r\n'

            #④ 响应体
            response_body=file_data
            #⑤ 响应数据
            response_data=(response_line+response_header+'\r\n').encode('utf-8')+file_data
            #发送数据
            conn_socket.send(response_data)
        finally:
            conn_socket.close()

创建web服务器多任务:

# 开发人:龙技术
# 个人训练
# 开发时间:2021/8/13 17:04
import socket
import threading
def handle_client_requset(conn_socket):
    # 5、接受客户端信息发送过来的HTTP请求
    recv_client_data = conn_socket.recv(4096)
    # 6.解析数据:
    if len(recv_client_data) > 0:
        recv_client_connt = recv_client_data.decode('utf-8')
        print(recv_client_connt)
        response_lj = recv_client_connt.split(' ', maxsplit=2)[1]
        if response_lj == '/':
            lj = 'static/index.html'
        else:
            lj = 'static' + response_lj
        # 7.返回HTTP响应给客户端游览器(1-响应行 2-响应头 3-空行 4-响应体)
        # ① 打开static目录下的index.html文件
        try:
            with open(lj, 'rb') as f:
                file_data = f.read()
        except Exception as e:
            with open('static/error.html', 'rb') as f:
                file_data = f.read()
            # 如果文件不存在,则返回HTTP、1.1 404 Not Found
            # ② 响应行
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            # ③ 响应头
            response_header = 'Server:PWB1.0\r\n'
            # 中文乱码解救方案:
            # response_header = 'Server:PWB1.0\r\nContent-type:text/html; charset=utf-8\r\n'

            # ④ 响应体
            response_body = file_data
            # ⑤ 响应数据
            response_data = (response_line + response_header + '\r\n').encode('utf-8') + file_data
            # 发送数据
            conn_socket.send(response_data)
        else:
            # ② 响应行
            response_line = 'HTTP/1.1 200 ok\r\n'
            # ③ 响应头
            response_header = 'Server:PWB1.0\r\n'
            # 中文乱码解救方案:
            # response_header = 'Server:PWB1.0\r\nContent-type:text/html; charset=utf-8\r\n'

            # ④ 响应体
            response_body = file_data
            # ⑤ 响应数据
            response_data = (response_line + response_header + '\r\n').encode('utf-8') + file_data
            # 发送数据
            conn_socket.send(response_data)
        finally:
            conn_socket.close()
#1.创建套接字对象
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#为了让绑定端口在服务断开后可以迅速释放,建议设置端口复用
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

#2.绑定Ip和端口(注意:参数比较特殊,要求是一个元组)
#绑定的ip地址可以不写,代表本机ip地址
tcp_server.bind(('192.168.15.28',8080))

#3.开始监听
tcp_server.listen(128)#listen()的参数代表最多处理128个客户端
while True:
    #4.准备接受客户端连接请求,产生新的套接字对象
    conn_socket,ip_port=tcp_server.accept()#tcp_server.accept()返回元组,一个是新的套接字对象,和客户端信息
    tcp=threading.Thread(target=handle_client_requset,args=(conn_socket,))
    tcp.start()


静态web服务器创建面对对象:

# 开发人:龙技术
# 个人训练
# 开发时间:2021/8/13 18:08
import socket
import threading
class web():
    def __init__(self):
        tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        tcp_server.bind(('192.168.15.28',8080))
        tcp_server.listen(128)
        self.tcp_server=tcp_server
    @staticmethod
    def handle_client_requset(conn_socket):
        recv_client_data = conn_socket.recv(4096)
        # 6.解析数据:
        if len(recv_client_data) > 0:
            recv_client_connt = recv_client_data.decode('utf-8')
            print(recv_client_connt)
            response_lj = recv_client_connt.split(' ', maxsplit=2)[1]
            if response_lj == '/':
                lj = 'static/index.html'
            else:
                lj = 'static' + response_lj
            # 7.返回HTTP响应给客户端游览器(1-响应行 2-响应头 3-空行 4-响应体)
            # ① 打开static目录下的index.html文件
            try:
                with open(lj, 'rb') as f:
                    file_data = f.read()
            except Exception as e:
                with open('static/error.html', 'rb') as f:
                    file_data = f.read()
                # 如果文件不存在,则返回HTTP、1.1 404 Not Found
                # ② 响应行
                response_line = 'HTTP/1.1 404 Not Found\r\n'
                # ③ 响应头
                response_header = 'Server:PWB1.0\r\n'
                # 中文乱码解救方案:
                # response_header = 'Server:PWB1.0\r\nContent-type:text/html; charset=utf-8\r\n'

                # ④ 响应体
                response_body = file_data
                # ⑤ 响应数据
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + file_data
                # 发送数据
                conn_socket.send(response_data)
            else:
                # ② 响应行
                response_line = 'HTTP/1.1 200 ok\r\n'
                # ③ 响应头
                response_header = 'Server:PWB1.0\r\n'
                # 中文乱码解救方案:
                # response_header = 'Server:PWB1.0\r\nContent-type:text/html; charset=utf-8\r\n'

                # ④ 响应体
                response_body = file_data
                # ⑤ 响应数据
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + file_data
                # 发送数据
                conn_socket.send(response_data)
            finally:
                conn_socket.close()
    def start(self):
        while True:
            connt_socket,ip=self.tcp_server.accept()
            tcp=threading.Thread(target=self.handle_client_requset,args=(connt_socket,))
            tcp.start()

if __name__ == '__main__':
    w=web()
    w.start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值