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 ...
随机推荐
- NOIP模拟 30
补坑,很多都忘了. T1 树 像我这种人都能考场A掉当然是道水题辣 求出每条有向边的期望就好了 T2 回文串 当时毫无思路,暴力写挂. 首先把B转过来,那么都变成后缀的前缀拼起来 对于每一个LCP,他 ...
- NOIP模拟测试8反思
被动态逆序对戏耍,来写博客这次考试油炸了 模板爆零,哈希调半天导致T3没时间,我都干了些什么&_& T3思路: 利用环的性质先拼成一条链,然后二分边界. 证明就不说啦(其实是我不会) ...
- dianFanEditor Web在线编辑器
个人很喜欢kodexplorer 的在线编辑器.苦于没有加载FTP目录的功能. 索性自己改造了一下,用.NET 做了几个WEB接口,用CEF3做浏览器内核,打包了在线地址做编辑器. 即可加载本地磁盘, ...
- vue踩坑 导出new Vue.Store首字母要大写
控制台报错 : Uncaught TypeError: vuex__WEBPACK_IMPORTED_MODULE_6__.default.store is not a constructor 根据 ...
- 二叉搜索树BST(C语言实现可用)
1:概述 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列.二叉搜索树是最简单的搜索树.其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值. 如果共 ...
- 201871010114-李岩松《面向对象程序设计(java)》第十周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- Head First设计模式——命令模式
前言:命令模式我们平常可能会经常使用,如果我们不了解命令模式的结构和定义那么在使用的时候也不会将它对号入座. 举个例子:在winform开发的时候我们常常要用同一个界面来进行文件的下载,但是并不是所有 ...
- 使用Spring安全表达式控制系统功能访问权限
一.SPEL表达式权限控制 从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限.Spring ...
- shell配置文件
个人配置主要集中在-/.profile文件中 打开新的交互式shell时,配置文件的执行顺序是/etc/profile /etc/bashrc ~/.profile 最后是~/.bashrc ...
- 0MQ底层队列设计
ypipe_t has a yqueue_t. pipe_t relates two ypipe(s).pipe_t就是0MQ框架内使用的底层队列. yqueue_t的设计目的. yqueue_t 的 ...