首页 > 其他分享 >静态web服务器-根据请求返回指定页面数据

静态web服务器-根据请求返回指定页面数据

时间:2023-08-21 23:55:49浏览次数:56  
标签:web 浏览器 请求 image socekt 服务器 data response 页面

实现步骤

1. 获取用户请求资源的路径

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

 

示例

import socket

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


if __name__ == '__main__':
    # 1.编写一个TCP服务端程序
    # 创建socekt
    tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口复用 
    tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定地址
    tcp_server_socekt.bind(("", 8080))
    # 设置监听
    tcp_server_socekt.listen(128)

    while True:
        # 2.获取浏览器发送的HTTP请求报文数据
        # 建立链接
        client_socekt, client_addr = tcp_server_socekt.accept()
        # 获取浏览器的请求信息
        client_request_data = client_socekt.recv(1024).decode()
        if len(client_request_data) <= 1:
            print("客户端已经关闭")
            print(client_request_data)
        else:
            # 获取用户请求资源的路径
            requst_data = client_request_data.split(" ")
            print(requst_data)
            # 求资源的路径
            request_path = requst_data[1]

            if request_path == "/":
                request_path = "/index.html"

            # 3.读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器
            # 根据请求资源的路径,读取指定文件的数据
            try:
                with open("./static" + request_path, "rb") as f:
                    file_data = f.read()
            except Exception as e:
                # 返回404错误数据
                # 应答行
                response_line = "HTTP/1.1 404 Not Found\r\n"
                # 应答头
                response_header = "Server:pwb\r\n"
                # 应答体
                response_body = "404 Not Found sorry"
                # 应答数据
                # 组装指定文件数据的响应报文,发送给浏览器
                response_data = (response_line + response_header + "\r\n" + response_body).encode()

                client_socekt.send(response_data)
            else:
                # 应答行
                response_line = "HTTP/1.1 200 OK\r\n"
                # 应答头
                response_header = "Server:pwb\r\n"
                # 应答体
                response_body = file_data
                # 应答数据
                # 组装指定文件数据的响应报文,发送给浏览器
                response_data = (response_line + response_header + "\r\n").encode() + response_body

                client_socekt.send(response_data)
            finally:
                # 4.HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字
                client_socekt.close()

 服务端控制台打印:


['GET', '/test.css', 'HTTP/1.1\r\nHost:', 'localhost:8080\r\nConnection:', 'keep-alive\r\nsec-ch-ua:', '"Chromium";v="118",', '"Google', 'Chrome";v="118",', '"Not=A?Brand";v="99"\r\nsec-ch-ua-mobile:', '?0\r\nsec-ch-ua-platform:', '"Windows"\r\nUpgrade-Insecure-Requests:', '1\r\nUser-Agent:', 'Mozilla/5.0', '(Windows', 'NT', '10.0;', 'Win64;', 'x64)', 'AppleWebKit/537.36', '(KHTML,', 'like', 'Gecko)', 'Chrome/118.0.0.0', 'Safari/537.36\r\nAccept:', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\nSec-Fetch-Site:', 'none\r\nSec-Fetch-Mode:', 'navigate\r\nSec-Fetch-User:', '?1\r\nSec-Fetch-Dest:', 'document\r\nAccept-Encoding:', 'gzip,', 'deflate,', 'br\r\nAccept-Language:', 'zh-CN,zh;q=0.9\r\nCookie:', 'Idea-30eca14b=5671be82-bc4b-4154-8aa0-7ea8dc722c2d;', 'Pycharm-a2976cb7=daed6ffd-95bc-4940-b9b4-2562e9a6fdca\r\n\r\n']
['GET', '/favicon.ico', 'HTTP/1.1\r\nHost:', 'localhost:8080\r\nConnection:', 'keep-alive\r\nsec-ch-ua:', '"Chromium";v="118",', '"Google', 'Chrome";v="118",', '"Not=A?Brand";v="99"\r\nsec-ch-ua-mobile:', '?0\r\nUser-Agent:', 'Mozilla/5.0', '(Windows', 'NT', '10.0;', 'Win64;', 'x64)', 'AppleWebKit/537.36', '(KHTML,', 'like', 'Gecko)', 'Chrome/118.0.0.0', 'Safari/537.36\r\nsec-ch-ua-platform:', '"Windows"\r\nAccept:', 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8\r\nSec-Fetch-Site:', 'same-origin\r\nSec-Fetch-Mode:', 'no-cors\r\nSec-Fetch-Dest:', 'image\r\nReferer:', 'http://localhost:8080/test.css\r\nAccept-Encoding:', 'gzip,', 'deflate,', 'br\r\nAccept-Language:', 'zh-CN,zh;q=0.9\r\nCookie:', 'Idea-30eca14b=5671be82-bc4b-4154-8aa0-7ea8dc722c2d;', 'Pycharm-a2976cb7=daed6ffd-95bc-4940-b9b4-2562e9a6fdca\r\n\r\n']
客户端已经关闭

小结

1. 获取用户请求资源的路径
  requst_data = client_request_data.split(" ")
  print(requst_data)
  # 求资源的路径
  request_path = requst_data[1]
2. 根据请求资源的路径,读取请求指定文件的数据
  with open("./static" + request_path, "rb") as f:
      file_data = f.read()
	  
3. 组装指定文件数据的响应报文,发送给浏览器
   response_data = (response_line + response_header + "\r\n").encode() + response_body
   client_socekt.send(response_data)
4. 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器
   except Exception as e:
       # 返回404错误数据
       # 应答行
       response_line = "HTTP/1.1 404 Not Found\r\n"
       # 应答头
       response_header = "Server:pwb\r\n"
       # 应答体
       response_body = "404 Not Found sorry"
       # 应答数据
       # 组装指定文件数据的响应报文,发送给浏览器
       response_data = (response_line + response_header + "\r\n" + response_body).encode()
       client_socekt.send(response_data)

  

 

标签:web,浏览器,请求,image,socekt,服务器,data,response,页面
From: https://www.cnblogs.com/allenxx/p/17647376.html

相关文章

  • 自研静态Web服务器并返回固定⻚⾯数据
    开发自己的静态Web服务器的步骤1.编写一个TCP服务端程序 2.获取浏览器发送的http请求报文数据 3.读取固定页面的数据,把页面数据组装成HTTP响应报文数据发送给浏览器。 4.HTTP响应报文数据发送完成以后,关闭服务与客户端的套接字静态Web服务器-返回固定页面数据的示例代码1......
  • t113-c-制作wifi设置页面
    c转命令行首先我们要用到命令行,c和命令行这么转换呢?https://blog.csdn.net/arv002/article/details/112711673根据这篇文章那么:popen:什么是popen?https://www.cnblogs.com/52php/p/5722238.html简单来说就是c语言和cmmd的交互函数,注意这个函数会产生子进程简单的测试一下:#......
  • 搭建Python⾃带静态Web服务器
    说明Python自带的静态Web服务器可以通过使用http.server模块来实现。步骤打开命令行终端,进入要作为静态文件根目录的文件夹。运行以下命令启动静态Web服务器:Python2.x版本:python-mSimpleHTTPServer<port>Python3.x版本:python-mhttp.server<port> <port>是可选参......
  • VUE3单页面应用开发常用工具
    Vite一种新型的前端构建工具,它主要由两个部分做成一个开发服务器,它基于 原生ES模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。社区模......
  • iwebsec-xss 01 反射型xss
    01、题目分析反射型跨站脚本攻击本质上是构造恶意连接的形式,诱导用户打开,由于链接内所携带的参数会回显于页面中或作为页面的处理数据源,最终造成XSS攻击。02、xss这一题已经提示是反射型xss了,而且还有提示,可以注入的参数为name,所以直接在参数值中输入js代码即可?name=<script......
  • iwebsec-xss 02 存储型xss
    01、题目分析存储型xss是将js代码存储在服务器端,当用户访问网页的时候,就会执行js代码,常见于留言板等功能模块02、xss这一题已经提示是存储型ss了,而且还有输入框,所以直接在输入框中输入js代码即可<script>alert(1)</script>可以发现js代码被成功执行了03、源码分析</form......
  • iwebsec-xss 03 DOM型xss
    01、题目分析DOM型比较与存储型不一样的是,存储型是将js代码存放在数据库中,而dom型是在客户端插入恶意代码,不涉及后端02、xss查看前端代码可以发现,有一个domxss函数,这段代码的作用是获取id为"input"的元素的值,并将其设置为id为"output"的元素的innerHTML属性所以直接在输入框......
  • iwebsec-xss 04 xss修复示例
    01、题目分析这一题就不是解题了,是教如何实现防范xss漏洞的,因此我们重点分析源码,是如何实现防范xss的02、xss按照第一关的xss方式去访问,可以明显发现没有出弹窗,而是把js代码作为文字输出到界面上03、源码分析<?phprequire_once'../header.php';?><html> <head> <titl......
  • 如何在uniapp对页面进行分包处理
    前言当今移动应用开发领域,随着用户对于应用功能和体验的要求不断提高,应用程序的复杂度也在不断增加。在这种情况下,应用程序的体积也随之增大,导致应用程序的加载时间变长,影响用户体验。为了解决这个问题,Uniapp提供了分包功能,可以将应用程序按照不同的模块进行分割,实现较快的加载速......
  • RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解
    大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。WebSocket协议WebSocket是一种在单个TCP连接上进行全双工通信的API技术。相比于传统的HTTP请求,We......