众所周知,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服务器开发的更多相关文章

  1. 04-HTTP协议和静态Web服务器

    一.HTTP协议(HyperText Transfer Protocol)     超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...

  2. 超简易静态Web服务器

    使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar

  3. python网络-静态Web服务器案例(29)

    一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...

  4. 第十八篇:简易版web服务器开发

    在上篇有实现了一个静态的web服务器,可以接收web浏览器的请求,随后对请求消息进行解析,获取客户想要文件的文件名,随后根据文件名返回响应消息:那么这篇我们对该web服务器进行改善,通过多任务.非阻塞 ...

  5. Harp – 内置常用预处理器的静态 Web 服务器

    Harp 是一个基于 Node.js 平台的静态 Web 服务器,内置流行的预处理器,支持把 Jade, Markdown, EJS, Less, Stylus, Sass, and CoffeeSc ...

  6. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  7. python超简单的web服务器

    今天无意google时看见,心里突然想说,python做web服务器,用不用这么简单啊,看来是我大惊小怪了. web1.py   1 2 3 #!/usr/bin/python import Simp ...

  8. python自带的web服务器

    python自带的web服务器 python自带的包可以建立简单的web服务器 BaseHTTPServer 提供基本的web服务和处理类 SimpleHTTPServer 包含执行get请求的Sim ...

  9. 用HTTP核心模块配置一个静态Web服务器

    静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...

随机推荐

  1. Linux 项目 shell 自动获取报告本机IP (1) | 通过shell 自动获取报告本机IP

    由于电脑设置静态IP经常出现链接不上网络,动态IP又非常不方便,故有了这个想法并实现 原理: Linux,包含PC机器,树莓派等,通过shell 自动获取报告本机IP  | 通过 Mutt+Msmtp ...

  2. 邵国际: C 语言对象化设计实例 —— 命令解析器

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 邵国际 来源: 微信公众号linux阅码场(id: linuxdev) 内容简介 单片机工程师常常疑惑为什么 ...

  3. Web微信开发工具无法输入中文?官方bug

    Ctrl+shift+w 重启工具就OK啦

  4. 删除Linux的依赖库并进入救援模式恢复

    删除Linux的依赖库并进入救援模式恢复 模拟一下依赖库文件被删,并进入救援模式恢复 系统:CentOS7 一.删除mv的依赖库文件 删除/lib64/libc.so.6 [root@centos7 ...

  5. 暑假CV-QKD的相关论文单词集(第一弹)

    CV-QKD  连续变量-量子秘钥分发 Quadrature  正交 Photon     光子 Coherent    连续的,连贯的 Reconciliation   调解 Cryptograph ...

  6. (C#)WPF:.h(头文件)、.lib(静态链接库文件)和.dll(动态链接库文件)之间的区别与联系

    静态链接库(Lib)与动态链接库(DLL)的区别 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和 ...

  7. Master原理

    1.主备切换机制原理剖析与源码分析 2.注册机制原理剖析与源码分析 3.状态改变处理机制源码分析 4.资源调度机制源码分析(schedule(),两种资源调度算法)(核心) 一.主备切换机制原理 1. ...

  8. lqb 基础练习 01字串 (itoa)

    基础练习 01字串 时间限制:1.0s   内存限制:256.0MB     问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 0 ...

  9. Vue项目使用CSS变量实现主题化

    主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件.现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了.最近,使用C ...

  10. python容器类型元组的操作

    元组:使用小括号进行表示一组元素,其元素与元素之间使用逗号隔开:注意:元组的的值是不可修改的: 1.元组值得增加:元组是不可以直接增加值的,但是可以通过+进行拼接 # 声明一个元组: tuple1 = ...