网络应用之静态Web服务器

news2024/9/30 9:31:57

静态Web服务器-返回固定页面数据

学习目标

  • 能够写出组装固定页面数据的响应报文


1. 开发自己的静态Web服务器

实现步骤:

  1. 编写一个TCP服务端程序

  1. 获取浏览器发送的http请求报文数据

  1. 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。

  1. HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。

2. 静态Web服务器-返回固定页面数据的示例代码

import socket


if __name__ == '__main__':
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用, 程序退出端口立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9000))
    # 设置监听
    tcp_server_socket.listen(128)
    whileTrue:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        recv_client_data = new_socket.recv(4096)
        # 对二进制数据进行解码
        recv_client_content = recv_client_data.decode("utf-8")
        print(recv_client_content)

        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)

        # 关闭服务与客户端的套接字
        new_socket.close()

3. 小结

  1. 编写一个TCP服务端程序

tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 循环接受客户端的连接请求whileTrue:
    conn_socket, ip_port = tcp_server_socket.accept()
  1. 获取浏览器发送的http请求报文数据

client_request_data = conn_socket.recv(4096)
  1. 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。

response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
conn_socket.send(response_data)
  1. HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。

conn_socket.close()

静态Web服务器-返回指定页面数据

学习目标

  • 能够写出组装指定页面数据的响应报文


1. 静态Web服务器的问题

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

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

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

  1. 根据请求资源的路径,读取指定文件的数据

  1. 组装指定文件数据的响应报文,发送给浏览器

  1. 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器

2. 静态Web服务器-返回指定页面数据的示例代码

import socket


defmain():# 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用, 程序退出端口立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9000))
    # 设置监听
    tcp_server_socket.listen(128)
    whileTrue:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        recv_client_data = new_socket.recv(4096)
        if len(recv_client_data) == 0:
            print("关闭浏览器了")
            new_socket.close()
            return# 对二进制数据进行解码
        recv_client_content = recv_client_data.decode("utf-8")
        print(recv_client_content)
        # 根据指定字符串进行分割, 最大分割次数指定2
        request_list = recv_client_content.split(" ", maxsplit=2)

        # 获取请求资源路径
        request_path = request_list[1]
        print(request_path)

        # 判断请求的是否是根目录,如果条件成立,指定首页数据返回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()

3. 小结

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

 request_list = client_request_conent.split(” ”,  maxsplit=2)
 request_path = request_list[1]
  1. 根据请求资源的路径,读取请求指定文件的数据

with open("static" + request_path, "rb") as file:
 file_data = file.read()
  1. 组装指定文件数据的响应报文,发送给浏览器

 response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
 conn_socket.send(response_data)
  1. 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器

try:
     # 打开指定文件,代码省略...except Exception as e:
     conn_socket.send(404响应报文数据)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[11]云计算|简答题|案例分析|云交付|云部署|负载均衡器|时间戳

升级学校云系统我们学校要根据目前学生互联网在线学习、教师教学资源电子化、教学评价过程化精细化的需求,计划升级为云教学系统。请同学们根据学校发展实际考虑云交付模型包含哪些?云部署采用什么模型最合适?请具体说明。9月3日买电脑还是租…

python之并发编程

一、并发编程之多进程 1.multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。 multiprocess…

SEO优化:干货技巧分享,包新站1-15天100%收录首页

不管是老域名还是新域名,不管是多久没有收录首页的站,此法周期7-30天,包首页收录!本人不喜欢空吹牛逼不实践的理论,公布具体操作:假如你想收录的域名是a.com,那么准备如下材料1.购买5-10个最便宜…

【Tomcat】Tomcat安装及环境配置

文章目录什么是Tomcat为什么我们需要用到Tomcattomcat下载及安装1、进入官网www.apache.org,找到Projects中的project List2、下载之后,解压3、找到tomcat目录下的startup.bat文件,双击之后最后结果出现多少多少秒,表示安装成功4、…

【Python工具篇】Anaconda中安装python2和python3以及在pycharm中使用

背景:已经安装好anaconda、python3、pycharm,因为项目使用的是python2语法,所以需要在anaconda中安装python2,并在pycharm中使用,下面给出步骤。 1. 打开cmd或者是Anaconda Prompt。 下面是anaconda prompt. 2. 查…

hadoop03-MapReduce【尚硅谷】

大数据学习笔记 MapReduce 一、MapReduce概述 MapReduce是一个分布式运算程序的编程框架,是基于Hadoop的数据分析计算的核心框架。 MapReduce处理过程为两个阶段:Map和Reduce。 Map负责把一个任务分解成多个任务;Reduce负责把分解后多任务处…

必应ai注册方法

1.进行配置下载Microsoft Edge Canary,链接下载 Microsoft Edge Insider Channels,打开Microsoft Edge Canary,在Header Editor - Microsoft Edge Addons中安装Header Editor插件,点击Header Editor图标,选择右下角的&…

网页唤起 APP中Activity的实现原理

疑问的开端大家有没有想过一个问题:在浏览器里打开某个网页,网页上有一个按钮点击可以唤起App。这样的效果是怎么实现的呢?浏览器是一个app;为什么一个app可以调起其他app的页面?说到跨app的页面调用,大家是…

python之面向对象编程

1、面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2、 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的…

STM32笔记

目录 1.1. 预备阶段 1.2. 单片机介绍 2. 初识STM32 2.1. STM32 1.1. 预备阶段 1.2. 单片机介绍 1.2.1. 单片机是什么 单片微型计算机(Single Chip Microcomputer)简称为单片机(Microcontrollers),也称为微控制单元(Microcontroller Uni…

Python对遥感影像重采样,以及重采样方法

首先,本次重采样使用的是GDAL方法完成 参考了以下博客,并根据自己的需要进行了删改以及原理的探究: 重采样:栅格影像重采样 我使用了下该代码,发现是可行的,但是仍然存在一定的问题,即他的采样…

【java web篇】Maven的基本使用以及IDEA 配置Maven

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

Redis高级-主从复制相关操作

2.1 主从复制简介 2.1.1 高可用 首先我们要理解互联网应用因为其独有的特性我们演化出的三高架构 高并发 应用要提供某一业务要能支持很多客户端同时访问的能力,我们称为并发,高并发意思就很明确了 高性能 性能带给我们最直观的感受就是:速…

西北工业大学大学物理(I)下期末考试2021-2022选填解析

11 告诉你n2了,那么l0或者1,后续限制类推。2 几乎每年都出。散射波波长的偏移只与散射角有关。3 产生激光的条件。先认识到激光就是受激幅射光放大。受激辐射是产生激光的必要条件,粒子数偏转是产生激光的必要条件,谐振腔也需要。…

速来~与 Werner Vogels 博士一起探索敏捷性与创新速度一起提升的秘方

Amazon Web Services 的现代应用程序创新一直是 Amazon 公司坚持追求的核心目标。约20年前,我们经历了一次彻底的转型,旨在建立起“发明、发布、再发明、再发布、重新开始、洗牌、再重复”的快速迭代流程。正是此番探索,彻底改变了我们构建应…

OAK相机如何将yoloV8模型转换成blob格式?

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

Paddle配置

目录: 1.激活环境 2.版本选择 突发情况:ModuleNotFoundError: No module named paddle 检验是否安装成功 1.激活环境 Anaconda: conda remove -n paddle --all conda activate paddle 2.版本选择 打开链接:https://www.pa…

银行数字化转型导师坚鹏:BLM银行数字化转型战略课程大纲

BLM银行数字化转型战略——以BLM模型为核心,实现知行果合一 课程背景: 很多银行存在以下问题: 不知道如何系统地制定银行数字化转型战略? 不清楚其它银行数字化转型战略是如何制定的? 不知道其它银行数字化转型战略…

【离线数仓-8-数据仓库开发DWD层设计要点-工具域互动域流量域用户域相关事实表】

离线数仓-8-数据仓库开发DWD层-工具域&互动域&流量域&用户域相关事实表离线数仓-8-数据仓库开发DWD层设计要点-工具域&互动域&流量域&用户域相关事实表一、工具域相关事实表1.工具域优惠券领取事务事实表&使用(下单)事务事实…

基于nodejs+vue的果蔬商城在线销售系统vscode

水果蔬菜在线销售借助于当今盛行互联网技术,为消费者和供应商提供了一个更加方便的交易平台,使消费者足不出户就可以选购所需商品,省下许多时间和精力。商家通过该销售系统可以快速了解市场行情,更好地适应市场需求,扩…