python网络-静态Web服务器案例(29)
一、静态Web服务器案例代码static_web_server.py
# coding:utf-8 # 导入socket模块
import socket
# 导入正则表达式模块
import re
# 导入多进程模块
from multiprocessing import Process # 设置静态文件根目录
HTML_ROOT_DIR = "./html" # 定义个一个HTTPServer的类
class HTTPServer(object):
"""""" # 初始化方法
def __init__(self):
# 创建一个服务器socket套接字
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket地址重用配置
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # HTTPServer开启的方法
def start(self):
# 设置监听字节长度为128
self.server_socket.listen(128)
# 不间断的监听是否有人链接服务器
while True:
# 解析请求链接服务器的客户端信息
client_socket, client_address = self.server_socket.accept()
print("[%s:%s]用户连接上了" % client_address)
# 创建多进程handle_client处理客户端的请求
handle_client_process = Process(target=self.handle_client, args=(client_socket,))
# 开启多进程
handle_client_process.start()
# 关闭客户端socket套接字
client_socket.close() # 多进程handle_client
def handle_client(self, client_socket):
"""处理客户端请求"""
# 获取客户端数据
request_data = client_socket.recv(1024) print("request data:", request_data)
# 多请求数据用空格做分割处理
request_headers_lines = request_data.splitlines()
for line in request_headers_lines:
print(line) # 解析请求报文
request_start_line = request_headers_lines[0] # 利用正则表达式提取用户请求的文件名
file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)
print(file_name)
if "/" == file_name:
file_name = "/index.html" # 打开文件 ,读取内容
try:
file = open(HTML_ROOT_DIR + file_name, "rb")
except IOError:
# 设置打开文件失败时返回的响应起始行\r\n是换行
response_start_line = "HTTP/1.1 404 Not Found\r\n"
# 设置打开文件失败时返回的响应头
response_headers = "Server:My server\r\n"
# 设置打开文件失败时返回的响应体
response_body = "The File is not found"
else:
# 打开成功时读取的客户端要请求的文件数据
file_data = file.read()
# 关闭文件
file.close() # 构造响应数据
response_start_line = "HTTP/1.1 200 OK\r\n"
# 构造响应头
response_headers = "Server:My server\r\n"
# 构造响应体
response_body = file_data.decode("utf-8") response = response_start_line + response_headers + "\r\n" + response_body
print("response data:", response) # 向客户端返回响应数据
client_socket.send(bytes(response, "utf-8")) # 关闭客户端连接
client_socket.close() # 绑定端口
def bind(self, port):
self.server_socket.bind(("", port)) def main():
# 创建HTTPServer对象
http_server = HTTPServer()
# 绑定端口
http_server.bind(8000)
# 开启服务
http_server.start() if __name__ == "__main__":
main()
二、index.html代码
说明:index.html在html文件夹中,html文件夹和static_web_server.py在同目录
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My web</title>
</head>
<body>
<h1>Se7eN_HOU</h1>
</body>
</html>
三、浏览器运行效果
四、说明
在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,所以:
HTML是一种用来定义网页的文本,会HTML,就可以编写网页;
HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信
python网络-静态Web服务器案例(29)的更多相关文章
- python网络-动态Web服务器案例(30)
一.浏览器请求HTML页面的过程 了解了HTTP协议和HTML文档,其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作 ...
- Python之HTTP静态Web服务器开发
众所周知,Http协议是基于Tcp协议的基础上产生的浏览器到服务器的通信协议 ,其根本原理也是通过socket进行通信. 使用HTTP协议通信,需要注意其返回的响应报文格式不能有任何问题. 响应报文, ...
- 04-HTTP协议和静态Web服务器
一.HTTP协议(HyperText Transfer Protocol) 超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...
- python 启动简单web服务器
有时我们在开发web静态页面时,需要一个web服务器来测试. 这时可以利用python提供的web服务器来实现. 1.在命令行下进入某个目录 2.在该目录下运行命令: python -m Simple ...
- 用HTTP核心模块配置一个静态Web服务器
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...
- Harp – 内置常用预处理器的静态 Web 服务器
Harp 是一个基于 Node.js 平台的静态 Web 服务器,内置流行的预处理器,支持把 Jade, Markdown, EJS, Less, Stylus, Sass, and CoffeeSc ...
- 超简易静态Web服务器
使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
- node 创建静态web服务器(下)(处理异步获取数据的两种方式)
接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...
随机推荐
- C# .NET 支付宝IOT小程序AES密钥解密
实际测试 KEY 是 16个 byte,byte[] byteKEY = System.Convert.FromBase64String(key); 注意:是Convert.FromBase6 ...
- k8s 使用本地镜像的时候
k8s默认会从远端拉取镜像,其配置参数imagePullPolicy为Always containers: - name: demo image: image imagePullPolicy: Nev ...
- Appcrawler 参数实战经验
https://testerhome.com/topics/10574 https://yq.aliyun.com/articles/277985 https://github.com/sevenir ...
- 关于close_wait状态的理解
以web服务器产生大量的close_wait状态为例 1.close_wait状态介绍: 客户端主动关闭连接,服务器接收到客户端的FIN,但是还没有发送自己的FIN,此时的状态为close_wait状 ...
- QPS和并发量
QPS(q) :每秒处理的请求数量 并发量 (c):同时支持多少个用户在线.与服务器的请求处理模型有关,如果是BIO模型,则并发量就受限于最大能支持多少个线程,如果是NIO模型,则并发量与socket ...
- hdfs、tfs、fastdfs、Tachyon
hdfs 架构设计 HDFS按照Master和Slave的结构.分NameNode.SecondaryNameNode.DataNode这几个角色. NameNode:是Master节点,是管理者.. ...
- Java集合对比
1.array和ArrayList 的区别?1.1:ArrayList是Array的复杂版本1.2:数组不能扩容集合可以扩容1.3:存储的数据类型:Array只能存储相同数据类型的数据,而ArrayL ...
- 【LEETCODE】45、766. Toeplitz Matrix
package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...
- InnoDB的MVCC实现原理
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的. 这两个列,一个保存了行的创建时间,一个保存了行的过期时间(删除时间).当然存储的并不是实际时间,而是系统版本号(sytem ve ...
- 为什么重写equals一定要重写hashCode方法?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...