一、静态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)的更多相关文章

  1. python网络-动态Web服务器案例(30)

    一.浏览器请求HTML页面的过程 了解了HTTP协议和HTML文档,其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作 ...

  2. Python之HTTP静态Web服务器开发

    众所周知,Http协议是基于Tcp协议的基础上产生的浏览器到服务器的通信协议 ,其根本原理也是通过socket进行通信. 使用HTTP协议通信,需要注意其返回的响应报文格式不能有任何问题. 响应报文, ...

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

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

  4. python 启动简单web服务器

    有时我们在开发web静态页面时,需要一个web服务器来测试. 这时可以利用python提供的web服务器来实现. 1.在命令行下进入某个目录 2.在该目录下运行命令: python -m Simple ...

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

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

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

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

  7. 超简易静态Web服务器

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

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

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

  9. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

随机推荐

  1. springboot实战日记(一)数据库基本信息

    摘要:基于spring boot的后端实现,开发一个微信小程序点餐系统,主要是写写思路和遇到的问题以及分享读到的好文章. 项目分析: 1.角色划分,就是开有什么人使用这个系统,买家(手机端),卖家(p ...

  2. Python MySQLdb 学习总结(转)

    转自http://www.cnblogs.com/coser/archive/2012/01/12/2320741.html 感谢@糖拌咸鱼 任何应用都离不开数据,所以在学习python的时候,当然也 ...

  3. Windows中使用 Python 调用 Matlab 程序

    https://ww2.mathworks.cn/help/matlab/matlab_external/system-and-configuration-requirements.html http ...

  4. PAT(B) 1090 危险品装箱(Java)

    题目链接:1090 危险品装箱 (25 point(s)) 题目描述 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题 ...

  5. API总结

    1. 什么是Webservice WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过 Web 来调用这个应用程序.我们把调用这个WebServ ...

  6. 【LEETCODE】40、1051. Height Checker

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  7. IP核——FIFO

    一.Quartus 1.打开Quartus ii,点击Tools---MegaWizard Plug-In Manager 2.弹出创建页面,选择Creat a new custom megafunc ...

  8. PB 奇葩BUG

    1. 在数据窗口的Edit 中选则CHeckBox 后,必须给默认值,否则会导致数据保存不了,也无提示. 2.当使用数据窗口的 setfile()函数时 如果 条件中有两个LIKE 则会报错,一个LI ...

  9. Different Subsets For All Tuples CodeForces - 660E (组合计数)

    大意: 定义$f(a)$表示序列$a$本质不同子序列个数. 给定$n,m$, 求所有长$n$元素范围$[1,m]$的序列的$f$值之和. 显然长度相同的子序列贡献是相同的. 不考虑空串, 假设长$x$ ...

  10. docker 入坑3

    查看镜像 docker images [OPTIONS] [REPOSITORY[:TAG]] -a, --all=false -f, --filter=[] --no-trunc=false -q, ...