Python高级-socket编程-2.4 静态web服务器

文章目录

    • 搭建Python自带静态Web服务器
      • 静态Web服务器是什么?
      • 如何搭建Python自带的静态Web服务器
      • 访问搭建的静态Web服务器
      • 查看浏览器和搭建的静态Web服务器的通信过程
    • 开发自己的静态Web服务器
      • 返回固定页面数据
      • 返回指定页面数据


搭建Python自带静态Web服务器


静态Web服务器是什么?

可以为发出请求的浏览器提供静态文档的程序。

平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。


如何搭建Python自带的静态Web服务器

搭建Python自带的静态Web服务器使用 python3 -m http.server 端口号

Python高级-socket编程-2.4 静态web服务器_第1张图片

-m选项说明:

m表示运行包里面的模块,执行这个命令的时候,需要进入你自己指定静态文件的目录,然后通过浏览器就能访问对应的 html文件了,这样一个静态的web服务器就搭建好了。

访问搭建的静态Web服务器

通过浏览器访问搭建的静态Web服务器

Python高级-socket编程-2.4 静态web服务器_第2张图片

查看浏览器和搭建的静态Web服务器的通信过程

查看http的通信过程

Python高级-socket编程-2.4 静态web服务器_第3张图片

开发自己的静态Web服务器


返回固定页面数据

实现步骤:

  1. 编写一个TCP服务端程序
  2. 获取浏览器发送的http请求报文数据
  3. 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。
  4. HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。
import socket


if __name__ == '__main__':
    # 创建tcp服务端套接字
    
    # 绑定端口号
   
    # 设置监听
    
    while True:
        # 等待接受客户端的连接请求
       
        # 代码执行到此,说明连接建立成功
       
        # 对二进制数据进行解码
       
        with open("static/index.html", "rb") as file:
            # 读取文件数据
            file_data = file.read()


        # 响应行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 响应头
        response_header = "Server: PWS1.0\r\n"

        # 响应体
        response_body = file_data

        # 拼接响应报文
        response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        # 发送数据
        new_socket.send(response_data)

        # 关闭服务与客户端的套接字

返回指定页面数据

静态Web服务器的问题

目前的Web服务器,不管用户访问什么页面,返回的都是固定页面的数据,接下来需要根据用户的请求返回指定页面的数据

返回指定页面数据的实现步骤:

  1. 获取用户请求资源的路径
  2. 根据请求资源的路径,读取指定文件的数据
  3. 组装指定文件数据的响应报文,发送给浏览器
  4. 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器
import socket


def main():

    # 创建tcp服务端套接字   
     
    # 绑定端口号
    
    # 设置监听
    
    while True:
        # 等待接受客户端的连接请求
       
        # 代码执行到此,说明连接建立成功
       
        if len(recv_client_data) == 0:
            print("关闭浏览器了")
            new_socket.close()
            return

        # 对二进制数据进行解码         
        
        # 根据指定字符串进行分割, 最大分割次数指定2
        
        # 获取请求资源路径       
        
        # 判断请求的是否是根目录,如果条件成立,指定首页数据返回
        
        if request_path == "/":
            request_path = "/index.html"

        try:
            # 动态打开指定文件
            with open("static" + request_path, "rb") as file:
                # 读取文件数据
                file_data = file.read()
        except Exception as e:
            # 请求资源不存在,返回404数据
            # 响应行
            response_line = "HTTP/1.1 404 Not Found\r\n"
            # 响应头
            response_header = "Server: PWS1.0\r\n"
            with open("static/error.html", "rb") as file:
                file_data = file.read()
            # 响应体
            response_body = file_data

            # 拼接响应报文
            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            # 发送数据
            new_socket.send(response_data)
        else:
            # 响应行
            response_line = "HTTP/1.1 200 OK\r\n"
            # 响应头
            response_header = "Server: PWS1.0\r\n"

            # 响应体
            response_body = file_data

            # 拼接响应报文
            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            # 发送数据
            new_socket.send(response_data)
        finally:
            # 关闭服务与客户端的套接字
            new_socket.close()

if __name__ == '__main__':
    main()

你可能感兴趣的:(#,Python高级,python)