静态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_dataresponse = response_line + response_header + "\r\n" + response_bodyresponse_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.htmldef 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)# 判断接受的数据长度是否为0if 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_dataresponse = (response_line + response_header + "\r\n").encode("utf-8") + response_bodynew_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)# 判断接受的数据长度是否为0if 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_dataresponse = (response_line + response_header + "\r\n").encode("utf-8") + response_bodynew_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_dataresponse = (response_line + response_header + "\r\n").encode("utf-8") + response_bodynew_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)# 判断接受的数据长度是否为0if 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_dataresponse = (response_line + response_header + "\r\n").encode("utf-8") + response_bodynew_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_dataresponse = (response_line + response_header + "\r\n").encode("utf-8") + response_bodynew_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.rhkb.cn/news/244745.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态分析C语言生成函数调用关系的利器——cally和egypt

大纲 准备工作安装graphviz安装cally安装egypt简单分析GCC产生RTL(Register transfer language)文件callyegypt总结 高级分析callyegypt 总结参考资料 在《静态分析C语言生成函数调用关系的利器——cflow》和《静态分析C语言生成函数调用关系的利器——c…

HarmonyOS鸿蒙学习基础篇 - Text文本组件

该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 Text文本组件是可以显示一段文本的组件。该组件从API Version 7开始支持,从API version 9开始,该接口支持在ArkTS卡片中使用。 子组件 可…

Flutter 页面嵌入 Android原生 View

前言 文章主要讲解Flutter页面如何使用Android原生View,但用到了Flutter 和 Android原生 相互通信知识,建议先看完这篇讲解通信的文章 Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel-CSDN博客 数据观…

Java面试题50道

文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…

rabbitmq基础-java-5、Topic交换机

1、简介 Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。 只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符! BindingKey 一般都是有一个或多个单词组成,多个单词之间以.分割&#x…

(SSO单点登录)多个系统之间如何实现账号互通

SSO具有以下优点: 降低访问第三方网站风险;降低用户名和密码的管理成本;提高用户试用满意度;SSO使用标准的身份认证和授权协议,如OAuth、OpenID Connect等,可以保障用户身份的安全性和隐私性。 单点登录最大…

文件上传技术总结

语言可解析的后缀 (前提:在Apache httpd.conf 配置文件中有特殊语言的配置 AddHandler application/x-httpd-php .php 搭配大小写、双重、空格来进行 其中: phtml、pht、php3、php4和php5都是Apache和php认可的php程序的文件后缀 常见的…

C#使用IsLeapYear方法判断指定年份是否为闰年

目录 一、判断指定年是否为闰年的2个方法 1.使用IsLeapYear方法判断指定年份是否为闰年 2.使用自定义的算法计算指定年份是否为闰年 二、示例 1.方法1的实例 2.方法2的实例 一、判断指定年是否为闰年的2个方法 1.使用IsLeapYear方法判断指定年份是否为闰年 使用IsLeapY…

【立创EDA-PCB设计基础】6.布线铺铜实战及细节详解

前言:本文进行布线铺铜实战及详解布线铺铜的细节 在本专栏中【立创EDA-PCB设计基础】前面完成了布线铺铜前的设计规则的设置,接下来进行布线 布局原则是模块化布局(优先布局好确定位置的器件,例如排针、接口、主控芯片&#xff…

司铭宇老师:门店经理培训:如何成为一位卓越的门店经理

门店经理培训:如何成为一位卓越的门店经理 在激烈的市场竞争中,门店经理作为门店的灵魂人物,肩负着提升门店业绩、维护品牌形象、带领团队成长等重要职责。本文将为您解析如何成为一位卓越的门店经理,助力您的职业生涯迈向新高峰…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中,快速插入参考文献 写在最前面第一步:在文献检索网站导出引用文献的bib文件第二步:编辑overleaf模版方法二:EduBirdie生成参考文献(补充)使用LaTeX在Overleaf的IEEE会议…

html火焰文字特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5火焰文字特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen" type&quo…

接口测试 02 -- JMeter入门到实战

前言 JM eter毕竟是做压测的工具&#xff0c;自动化这块还是有缺陷。 如果公司做一些简单的接口自动化&#xff0c;可以考虑使用JMeter快速完成&#xff0c;如果想做完善的接口自动化体系&#xff0c;建议还是基于Python来做。 为什么学习接口测试要先从JMeter开始&#xff1f;…

路由器配置虚拟服务器

文章目录 路由器配置虚拟服务器1.前言2.配置流程2.1 进入路由器的登录页面2.2 找到端口映射功能2.3 添加虚拟服务器2.4 查找路由器的动态IP2.5 SSH连接 路由器配置虚拟服务器 1.前言 局域网下面连接着路由器&#xff0c;路由器下面连接着服务器&#xff0c;我们自己的电脑想要…

Unity | 渡鸦避难所-8 | URP 中利用 Shader 实现角色受击闪白动画

1. 效果预览 当角色受到攻击时&#xff0c;为了增加游戏的视觉效果和反馈&#xff0c;可以添加粒子等动画&#xff0c;也可以使用 Shader 实现受击闪白动画&#xff1a;受到攻击时变为白色&#xff0c;逐渐恢复为正常颜色 本游戏中设定英雄受击时播放粒子效果&#xff0c;怪物…

什么是ORM思想?

1. ORM概念 ORM&#xff08;Object Relational Mapping&#xff09;对象关系映射模式&#xff0c;是一种技术&#xff0c;解决了面向对象与关系型数据库存互不匹配的现象。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 2. ORM由来 在软件开发的过程中&#xff0c;通常…

【每日一题】最长交替子数组

文章目录 Tag题目来源解题思路方法一&#xff1a;双层循环方法二&#xff1a;单层循环 写在最后 Tag 【双层循环】【单层循环】【数组】【2024-01-23】 题目来源 2765. 最长交替子数组 解题思路 两个方法&#xff0c;一个是双层循环&#xff0c;一个是单层循环。 方法一&am…

C++——结构体

1&#xff0c;结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。像int&#xff08;整型&#xff09;&#xff0c;浮点型&#xff0c;bool型&#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

Redis(五)

1、布隆过滤 1.1、简介 由一个初值都为零的bit数组和多个哈希函数构成&#xff0c;可以用来快速判断集合中是否存在某个元素&#xff0c;减少占用内存&#xff0c;不保存数据信息&#xff0c;只是在内存中做出一个标记。 它实际上是一个很长的二进制数组(00000000)一系列随机h…

Linux破解密码

破解root密码&#xff08;Linux 7&#xff09; 1、先重启——e 2、Linux 16这一行 末尾加rd.break&#xff08;不要回车&#xff09;中断加载内核 3、再ctrlx启动&#xff0c;进入救援模式 4、mount -o remount&#xff0c;rw /sysroot/——&#xff08;mount挂载 o——opti…