静态web服务器实战

准备html页面,包含两个页面(index.html, index2.html)和一个404(404html)页面,目录示意:

1.返回固定页面

with open("website/index.html","r") as file:

import socket

# # 返回固定的页面 website/index.html
if __name__== '__main__':
    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(("",8000))

    tcp_server_socket.listen(128)
    #  循环等待接受客户端的连接请求
    while True:
        new_socket,ip_port = tcp_server_socket.accept()
        recv_data = new_socket.recv(4096)
        print(recv_data)
        with open("website/index.html","r") as file:
            file_data = file.read()
        # 把数据封装成http响应报文格式的数据
            
        # 响应行
        response_line = "HTTP/1.0 200 OK\r\n"
        # 响应头
        response_header = "Server:PWS/1.0\r\n"
        # 空行
        # 响应体
        response_body = file_data
      
        response = response_line + response_header + "\r\n" + response_body
        
        response_data = response.encode("utf-8")

        new_socket.send(response_data)

        new_socket.close()

            

2.返回指定页面代码,动态指定request path

with open("website"+request_path,"rb") as file:

import socket

# 返回指定的页面 website/index.html

def pages():
    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(("",8000))

    tcp_server_socket.listen(128)
    #  循环等待接受客户端的连接请求
    while True:
        new_socket,ip_port = tcp_server_socket.accept()
        recv_data = new_socket.recv(4096)
        # 判断接受的数据长度是否为0
        if len(recv_data)==0:
            new_socket.close()
            return
        # 对二进制数据进行解码
        recv_content = recv_data.decode("utf-8")
        request_list = recv_content.split(" ",maxsplit=2)
        request_path = request_list[1]
        print(request_path)
        if request_path=="/":
            request_path = "/index.html"
        with open("website"+request_path,"rb") as file:
            file_data = file.read()
        # 把数据封装成http响应报文格式的数据
            
        # 响应行
        response_line = "HTTP/1.0 200 OK\r\n"
        # 响应头
        response_header = "Server:PWS/1.0\r\n"
        # 空行
        # 响应体
        response_body = file_data
      
        response = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        
        new_socket.send(response)

        new_socket.close()

            

if __name__== '__main__':
   pages()

3.如果页面不存在返回404页面

with open("website/404.html","rb") as file:

import socket

# 解决404页面

def pages():
    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(("",8000))

    tcp_server_socket.listen(128)
    #  循环等待接受客户端的连接请求
    while True:
        new_socket,ip_port = tcp_server_socket.accept()
        recv_data = new_socket.recv(4096)
        # 判断接受的数据长度是否为0
        if len(recv_data)==0:
            new_socket.close()
            return
        # 对二进制数据进行解码
        recv_content = recv_data.decode("utf-8")
        request_list = recv_content.split(" ",maxsplit=2)
        request_path = request_list[1]
        print(request_path)
        if request_path=="/":
            request_path = "/index.html"

        try:
            with open("website"+request_path,"rb") as file:
                file_data = file.read()
           
        except Exception as e:
            with open("website/404.html","rb") as file:
                file_data = file.read()
                 # 响应行
            response_line = "HTTP/1.0 404 Not Found\r\n"
            # 响应头
            response_header = "Server:PWS/1.0\r\n"
            # 空行
            # 响应体
            response_body = file_data
        
            response = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            
            new_socket.send(response)
        else:
             # 把数据封装成http响应报文格式的数据
            # 响应行
            response_line = "HTTP/1.0 200 OK\r\n"
            # 响应头
            response_header = "Server:PWS/1.0\r\n"
            # 空行
            # 响应体
            response_body = file_data
        
            response = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            
            new_socket.send(response)
       
       
        finally:
            new_socket.close()

            

if __name__== '__main__':
   pages()

3.1 拓展,如果服务端有error

 except Exception as e:
        print(f"Error: {e}")
        response_line = "HTTP/1.0 500 Internal Server Error\r\n"
        response_header = "Server:PWS/1.0\r\n"
        response_body = b"Internal Server Error"
        response = (response_line + response_header + "\r\n").encode("utf-8") + response_body

4.多任务运行,threading

import socket
import threading

# 解决404页面
# 解决多线程访问
def handle_client_reques(new_socket):
    recv_data = new_socket.recv(4096)

        # 判断接受的数据长度是否为0
    if len(recv_data)==0:
        new_socket.close()
        return

    # 对二进制数据进行解码
    recv_content = recv_data.decode("utf-8")
    request_list = recv_content.split(" ",maxsplit=2)
    request_path = request_list[1]
    print(request_path)
    if request_path=="/":
        request_path = "/index.html"

    try:
        with open("website"+request_path,"rb") as file:
            file_data = file.read()
        
    except Exception as e:
        with open("website/404.html","rb") as file:
            file_data = file.read()
                # 响应行
        response_line = "HTTP/1.0 404 Not Found\r\n"
        # 响应头
        response_header = "Server:PWS/1.0\r\n"
        # 空行
        # 响应体
        response_body = file_data
    
        response = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        
        new_socket.send(response)
    else:
            # 把数据封装成http响应报文格式的数据
        # 响应行
        response_line = "HTTP/1.0 200 OK\r\n"
        # 响应头
        response_header = "Server:PWS/1.0\r\n"
        # 空行
        # 响应体
        response_body = file_data
    
        response = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        
        new_socket.send(response)
    
    
    finally:
        new_socket.close()

def pages():
    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(("",8000))

    tcp_server_socket.listen(128)
    #  循环等待接受客户端的连接请求
    while True:
        new_socket,ip_port = tcp_server_socket.accept()
        sub_threading = threading.Thread(target=handle_client_reques,args=(new_socket,))
        sub_threading.setDaemon(True)
        sub_threading.start()
        
       
            

if __name__== '__main__':
   pages()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 面试题 | 10.精选Redis高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

android 图片添加水印

android 图片添加水印 本文主要讲下android 中如何给图片添加水印. 在Android中给图片添加水印可以使用Bitmap、Matrix和Canvas类的方法来实现. private Bitmap addWater() {// 加载原始图片Bitmap sourceBitmap BitmapFactory.decodeResource(getResources(), R.mipmap.sou…

云原生安全:风险挑战与安全架构设计策略

概述 数字化转型已经成为当今最流行的话题之一,大部分企业已经开启自身的数字化转型之旅,在未来企业只有数字化企业和非数字化企业之分。通过数字经济的加速发展,可以有效推动企业数字化转型的步伐。云计算作为数字化转型的底座和重要的载体…

『OpenCV-Python鼠标画笔』

OpenCV-Python教程链接: https://opencv-python-tutorials.readthedocs.io/ 示例一:图片上双击的位置绘制一个圆圈 首先创建一个鼠标事件回调函数,鼠标事件发生时就会被执行。鼠标事件可以是鼠标上的任何动作,比如左键按下&#x…

HarmonyOS关于deps、external_deps的使用

在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,为了便于后续处理部件间依赖关系,我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 如上图所示,主要分为部件内依赖(图左)…

如何降低微服务复杂度丨云栖大会微服务主题分享实录

作者:谢吉宝 本文整理自阿里云资深技术专家、中间件负责人谢吉宝在2023云栖大会《极简微服务模式,降低微服务复杂度的最佳实践》的分享 2023 云栖大会现场 当面临复杂的挑战时,"分而治之"的方法往往能取得显著的效果。微服务架构…

Qt编写linux系统onvif工具(支持预览/云台/预置位/录像等)

一、功能特点 广播搜索设备,支持IPC和NVR,依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。可对每个设备设…

mmpose 2d姿态预测值转json文件

目录 效果图: 参考 模板文件下载地址: python预测代码: 效果图: <

Mall4j电商系统 java电商系统 后台界面-mall4v

一个基于vue、element ui 的轻量级、前后端分离、拥有完整sku和下单流程的完全开源商城后台所属前端界面 前言 mall4j商城项目致力于为中小企业打造一个完整、易于维护的开源的电商系统&#xff0c;采用现阶段流行技术实现。后台管理系统包含商品管理、订单管理、运费模板、规…

《动手学深度学习(PyTorch版)》笔记3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;本书源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode测试通过。 Chapter3 Linear …

【模拟通信】AM、FM等的调制解调

调制相关的概念 调制&#xff1a;控制载波的参数&#xff0c;使载波参数随调制信号的规律变化 已调信号&#xff1a;受调载波&#xff0c;含有调制信号的全部特征 调制的作用: 提高发射效率多路复用&#xff0c;提高信道利用率提高系统抗干扰能力 两种调制方式 线性调制&a…

主播产品对比话术

—、价格对比 主播产品A︰这款产品定价相对较高&#xff0c;但是其品质和功能都是一流的&#xff0c;对于追求高端体验的消费者来说&#xff0c;物有所值。 主播产品B∶这款产品的价格相对较低&#xff0c;性价比很高&#xff0c;对于预算有限的消费者来说&#xff0c;是个不…

链表OJ---排序链表

https://leetcode.cn/problems/7WHec2/description/ //合并 struct ListNode* merge_link(struct ListNode* head1, struct ListNode* head2) {struct ListNode* temhead malloc(sizeof(struct ListNode));temhead->val 0;struct ListNode *tmp temhead, *cur1 head1, *…

Leetcode—2696. 删除子串后的字符串最小长度【简单】

2023每日刷题&#xff08;八十八&#xff09; Leetcode—2696. 删除子串后的字符串最小长度 实现代码 class Solution { public:int minLength(string s) {string sub " ";for(auto c: s) {if((c B && sub.back() A) || (c D && sub.back() C…

【推荐100个unity插件】3D物品描边效果——Quick Outline免费插件

文章目录 前言地址介绍使用例子完结 前言 关于3D描边&#xff0c;其实之前有用shader弄过一个&#xff1a;【实现100个unity特效】shader实现3D物品闪光和描边效果 但是很遗憾的是他不支持URP项目&#xff0c;所以现在推荐这款插件&#xff0c;他能很好的支持URP&#xff0c;…

SAP EXCEL上传行数限制问题(ALSM_EXCEL_TO_INTERNAL_TABLE)

标准函数ALSM_EXCEL_TO_INTERNAL_TABLE上传EXCEL函数限制上限是9999行&#xff0c;如果上传数据记录数超过9999行的情况&#xff0c;需要拷贝标准的函数封装一个自定义的函数进行处理 标准的函数ROW的长度为4位&#xff0c;如下图所示 因此&#xff0c;如果想行数的位数超过4位…

Wordpress seo优化该怎么做?

Wordpress作为开源管理系统&#xff0c;目前已然是世界上最流行的cms之一&#xff0c;这不仅仅因为他开源&#xff0c;对用户友好&#xff0c;让任何人都能轻而易举的制作网站&#xff0c;更是因为这套程序对于搜索引擎非常友好&#xff0c;是做谷歌seo的不二之选 Wordpress作为…

【仿网易云H5部署】Nodejs后台 + uniapp前台 部署

前言 之前在b站跟着学习写了前锋的<仿网易云音乐>uniapp项目 , 在这里记录一下H5版本的部署上线的过程. 这是该项目的b站链接:【千锋教育】前端项目_uni-app入门到实战项目之《仿网易云音乐》_哔哩哔哩_bilibili 一.后端 使用宝塔面板来部署 (1) 百度搜索宝塔面板, 复…

python的 read, readlines,readline 有何异同,读取文件的时候用哪个好?怎么选择。

先看是什么&#xff0c;再看怎么用。着急的话&#xff0c;可以看最后的一节。 开始前&#xff0c;先介绍一个小技巧&#xff1a;内置函数 repr&#xff08;英文名representation&#xff09;。开发调试用的&#xff0c;返回一个对象的字符串表示形式&#xff0c;包含对象的类型…

GitLab入门指南:上传与下载操作一网打尽

GitLab简介&#xff1a; GitLab是一个基于Git的开源仓库管理系统&#xff0c;提供了一个Web界面的Git存储库管理器&#xff0c;并集成了多种开发工具的功能&#xff0c;如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署&#xff0c;也可以使用其提供…