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 ...
随机推荐
- Project Euler 55: Lychrel numbers
五十五.吕克雷尔数(Lychrel numbers) 如果我们把\(47\)翻转过来并和其自身相加,结果是\(47+74=121\)是一个回文数.并不是所有的数都可以这么快的变成回文数,比如说: \[ ...
- 基于typedef的用法详解【转】
也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命 ...
- 802.11ac速率集
- Spring资源下载(官网)
Spring 资源jar包官网下载地址: 点击Spring
- Unity加载AB包
Unity制作游戏AB包 需要注意的是在游戏场景运行的情况下,不能编译AB包,不运行的情况下编译AB包需要使用Unity的扩展菜单功能,首先需要建立菜单用来编译AB包. 1.建立AB包的名字,首先选中 ...
- SQL Server 2014:在修改表的内容时,提示“此单元格已更改,尚未将更改提交到数据库”,怎么处理?
那一行上的属性为“不允许为null”的所有字段都填上对应信息,按回车键或者点击下一行任意一个单元格便会自动将更改的信息提交到数据库.
- 一个ip, 两个域名, 两个ssl, 访问多个不同的项目
在前面一篇中说过, 入了好几个坑. 后来使用了nginx+tomcat配置的方式. 终于成功了. 因为头一次使用nginx, 不知道具体怎么操作, 于是我在操作的时候, 按照以下几个步骤执行的: 导航 ...
- nyoj 44-子串和(子串和最大问题)
44-子串和 内存限制:64MB 时间限制:5000ms Special Judge: No accepted:12 submit:48 题目描述: 给定一整型数列{a1,a2...,an},找出连续 ...
- nyoj 46-最少乘法次数 (递推)
46-最少乘法次数 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:5 submit:18 题目描述: 给你一个非零整数,让你求这个数的n次方,每次相 ...
- java中的string对象深入了解
这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...