Python之HTTP静态Web服务器开发
众所周知,Http协议是基于Tcp协议的基础上产生的浏览器到服务器的通信协议 ,其根本原理也是通过socket进行通信。
使用HTTP协议通信,需要注意其返回的响应报文格式不能有任何问题。
响应报文,一共包括4个部分,分别是响应行,响应头,空行,响应体,并且每项数据之间必须使用/r/n隔开。
空行是区分响应头和响应体的必要数据,不能省略。
HTTP静态Web服务器主要开发思路如下:
1.导入socket模块
2.创建socket对象
3.设置端口复用,解决端口阻塞问题
4.绑定端口及ip,在绑定端口及IP后,客户端只能通过绑定的IP及端口给服务器发送请求报文。
5.设置监听,
注意:设置监听成功后,原socket变成被动套接字,不能够进行数据的收发。
6.等待客户端(浏览器)链接(发送请求)
7.使用链接成功后返回的新socket进行数据的收发。
注意:此处返回数据应为HTTP响应报文。
# 1.导入模块
import socket def main():
# 2.创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3.设置端口复用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 4.绑定端口
server_socket.bind(('', 8001))
# 5.设置监听
server_socket.listen(128)
# 设置循环接收客户端连接,实现多客户端连接
while True:
# 6.接收客户端连接
client_socket, ip_port = server_socket.accept()
print("客户端:%s 上线了,使用端口为:%s" % ip_port)
# 7.接收数据
recv_data = client_socket.recv(1024).decode('utf-8')
if recv_data:
# print('接收的数据为:', recv_data)
# 获取http请求报文中的指定路径
# split()方法不指定参数时,默认以空白字符(\t,\n,空格)分割
# 获取到的路径信息分割后,会形成三部分存放到列表中
# 1.请求提交的方式:GET/POST
# 2.请求路径信息及参数信息
# 3.HTTP协议及版本
page_recv_data = recv_data.split()[1]
print('请求的资源路径为:', page_recv_data)
# 判断接受到的路径信息是否包含参数
# HTTP协议中,参数格式为:/index.html?name=666&age=12
if '?' in page_recv_data:
real_recv_page = page_recv_data.split('?')[0]
else:
real_recv_page = page_recv_data
try:
# 8.发送数据 # 接收指定的路径信息,并读取文件信息
# 注意f-string只能在3.6及以上版本使用
data = f'static{real_recv_page}'
print(data)
with open(data, 'rb') as file:
page_data = file.read()
except Exception as e:
# 8.1 当文件不存在时,编写HTTP协议如下格式:
http_line = 'HTTP/1.1 / 404 NOT FOUND\r\n'
http_header = 'Server: PWS/1.0\r\n'
http_body = '<h1>Page Not Found!</h1>'
send_data = (http_line + http_header + '\r\n' + http_body).encode()
client_socket.send(send_data)
else:
# 8.1 当文件存在时,编写HTTP协议如下格式:
http_line = 'HTTP/1.1 / 200 ok\r\n'
http_header = 'Server: PWS/1.0\r\n'
send_data = (http_line + http_header + '\r\n').encode() + page_data
client_socket.send(send_data)
finally:
# 断开与客户端连接
client_socket.close()
else:
print('客户端:%s,端口号:%s 下线了' % ip_port)
break # 9.关闭套接字
# 关闭服务器
# server_socket.close() # 入口
if __name__ == '__main__':
main()
Python之HTTP静态Web服务器开发的更多相关文章
- 04-HTTP协议和静态Web服务器
一.HTTP协议(HyperText Transfer Protocol) 超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...
- 超简易静态Web服务器
使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar
- python网络-静态Web服务器案例(29)
一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...
- 第十八篇:简易版web服务器开发
在上篇有实现了一个静态的web服务器,可以接收web浏览器的请求,随后对请求消息进行解析,获取客户想要文件的文件名,随后根据文件名返回响应消息:那么这篇我们对该web服务器进行改善,通过多任务.非阻塞 ...
- Harp – 内置常用预处理器的静态 Web 服务器
Harp 是一个基于 Node.js 平台的静态 Web 服务器,内置流行的预处理器,支持把 Jade, Markdown, EJS, Less, Stylus, Sass, and CoffeeSc ...
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
- python超简单的web服务器
今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py 1 2 3 #!/usr/bin/python import Simp ...
- python自带的web服务器
python自带的web服务器 python自带的包可以建立简单的web服务器 BaseHTTPServer 提供基本的web服务和处理类 SimpleHTTPServer 包含执行get请求的Sim ...
- 用HTTP核心模块配置一个静态Web服务器
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...
随机推荐
- 消息中心 - Laravel的Redis队列(一)
前言 Laravel的队列可以用在轻量级的队列需求中.比如我们系统中的短信.邮件等功能,这些功能有一些普遍的特征,异步.重试.并发控制等.Laravel现在主要支持的队列服务有Null.Sync.Da ...
- python学习之【第十篇】:Python中的内置函数
1.前言 内置函数,就是Python内部预先定义好的函数,可以直接使用,Python中内置函数有以下这么多个: 2.map() 描述: map() 会根据提供的函数对指定序列做映射.第一个参数 fun ...
- Java基础系列5:Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...
- Linux的组管理和权限管理
前言 前面的文章中提到:Linux在管理用户权限时,既是面向用户的,又是面向组的,通过管理用户的权限规定了其对所拥有的文件的权限(读.改.执行),通过管理组的权限而规定了该组中用户对于某一文件的权限. ...
- 监听器以及在监听类里面获得bean的方法
1实现HttpSessionListener和ServletContextListener,2个接口 2然后在contextInitialized初始化方法里面: ServletContext app ...
- .NET Core前后端分离快速开发框架(Core.3.0+AntdVue)
.NET Core前后端分离快速开发框架(Core.3.0+AntdVue) 目录 引言 简介 环境搭建 开发环境要求 基础数据库构建 数据库设计规范 运行 使用教程 全局配置 快速开发 管理员登录 ...
- 大数据HDFS相关的一些运维题
1.在 HDFS 文件系统的根目录下创建递归目录“1daoyun/file”,将附件中的BigDataSkills.txt 文件,上传到 1daoyun/file 目录中,使用相关命令查看文件系统中 ...
- nyoj 77-开灯问题 (倍数遍历)
77-开灯问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:24 难度:1 题目描述: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍 ...
- 【前端知识体系-CSS相关】CSS特效实现之Transition和Transform对比
CSS效果 1.使用div绘制图形(三角形)? <!DOCTYPE html> <html lang="en"> <head> <meta ...
- kafka connector 使用总结以及自定义connector开发
Kafaka connect 是一种用于在Kafka和其他系统之间可扩展的.可靠的流式传输数据的工具.它使得能够快速定义将大量数据集合移入和移出Kafka的连接器变得简单.Kafka Connect可 ...