静态web服务器实战

news2024/12/23 18:46:44

准备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()

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

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

相关文章

深度学习笔记(九)——tf模型导出保存、模型加载、常用模型导出tflite、权重量化、模型部署

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 本篇博客主要是工具性介绍,可能由于软件版本问题导致的部分内容无法使用。 首先介绍tflite: TensorFlow Lite 是一组工具,可帮助开…

调优 mybatis saveBatch 25倍性能

调优 mybatis saveBatch 25倍性能 最近在压测一批接口,发现接口处理速度慢的有点超出预期,感觉很奇怪,后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch…

Backtrader 文档学习-Order OCO orders

Backtrader 文档学习-Order OCO orders 主要是可以使用订单组的管理策略,使用订单组策略,则一组订单中,有一个符合条件的订单成交,订单组中其他的订单就自动被取消。 1.概述 V1.9.36.116 版本交互式代理支持StopTrail、StopTra…

Django笔记(六):DRF框架

首 前后端分离是互联网应用开发的标准使用方式,让前后端通过接口实现解耦,能够更好的进行开发和维护。 RESTful接口常见规范 在接口设计中,大家遵循一定的规范可以减少很多不必要的麻烦,例如url应有一定辨识度,可以…

Database__进阶

文章目录 😊 作者:Lion J 💖 主页: https://blog.csdn.net/weixin_69252724?spm1000.2115.3001.5343 🎉 主题: 数据库mysql(高级部分) ⏱️ 创作时间:2024年01月24…

MySQL-进阶-索引-结构

一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree(多路平衡查找树) 2、BTree 3、Hash

初识人工智能,一文读懂机器学习之逻辑回归知识文集(4)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

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

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

Flink入门教程

使用flink时需要提前准备好scala环境 一、创建maven项目 二、添加pom依赖 <properties><scala.version>2.11.12</scala.version></properties><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library<…

【服务器Midjourney】Midjourney网站0基础搭建

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

oracle vm安装ubuntu使用桥接网络不能访问外网

1. 问题描述 公司网络环境中&#xff0c;可以ping通内网中的所有电脑&#xff0c;ping不通百度域名以及百度的ip地址在热点共享时或者家里未出现此问题 2. 尝试的解决办法 设置网络共享&#xff0c;未起作用。后来测试通以后发现共享不共享都可以通 3. 最终解决办法 H3C禁…

树莓派基础应用:智能家居监控系统

引言&#xff1a; 随着智能家居的普及&#xff0c;家居安全与监控逐渐成为人们关注的焦点。树莓派作为一种功能强大的迷你计算机&#xff0c;为我们提供了实现智能家居监控系统的可能。在本篇博客中&#xff0c;我们将通过构建一个简单的智能家居监控系统&#xff0c;来探索树莓…

NRF24L01模块传输MPU6050数据,接收端数据一直为0问题记录

问题描述&#xff1a; 一、发射端 1、正确配置NRF模块&#xff0c;以及测试过能够正常通信&#xff0c;在发射端的发射线程中进行了如下操作 2、这里是获取了陀螺仪的x轴数据&#xff0c;将其而分为两个8位的数据存入发送缓冲区中。因为一个陀螺仪x轴数据是16位的&#xff0c…

Android 水印效果

Android 水印效果 本文主要介绍下android 中水印的实现效果. 实现的方式有多种,就不一一赘述了, 本文就是通过自定义drawable来实现水印. 不多说,直接上代码吧: import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; i…

QQ云端机器人登录系统php源码

这款源码主要是针对群机器人爱好者的&#xff0c;这是一个通过对接挂机宝里面机器人框架的一个网页站点&#xff0c;用户通过网页登录 QQ 账号至挂机宝里面框架&#xff08;可扫码登录、账密登录、跳转 QQ 快捷登录&#xff09;&#xff0c;无需通过机器人即可实现登录&#xf…

C/S客户端安装卸载更新

今天这个我一直没想写&#xff0c;因为现在好像c/s客户端的安装比较少 &#xff0c;应该很多公司都没有了&#xff0c;但是erp&#xff0c;一些自己公司内部使用的可能比较多&#xff0c;但是现在都比较倾向于BS结构的了&#xff0c;浅浅的了解下C/S的安装卸载更新吧~ 1、安装 …

【算法Hot100系列】合并区间

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

matlab GUI实现PID控制器参数配置

1、内容简介 略 39-可以交流、咨询、答疑 2、内容说明 略 3、 基于GUI的PID研究 本例子中设计一个PID控制器来研究不同参数对输出结果的影响&#xff0c;PID控制器由比例单元 P、积分单元 I 和微分单元 D 组成。PID 控制器是一个在工业控制应用中常见的反馈回路部件&…

消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

问题概览 目前主流的消息队列技术&#xff08;MQ技术&#xff09;分为RabbitMQ和Kafka&#xff0c;其中深蓝色为只要是MQ&#xff0c;一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ的应用场景 MQ主要提供的功能为&#xff1a;异…

冬天喝羊奶身体会发生什么变化?

冬天喝羊奶身体会发生什么变化&#xff1f; 冬天喝羊奶的身体变化&#xff0c;大家都应该知道吧&#xff1f;那么冬天喝羊奶到底会发生什么样的变化呢&#xff1f;是好是坏呢&#xff1f;今天小编羊大师就带大家来一起探讨一下。 冬天天气寒冷&#xff0c;人们往往会选择喝一…