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 ...
随机推荐
- SVN 本地文件锁/服务端文件锁清除步骤
1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选 ...
- 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串
最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...
- 通过cmd命令控制台关闭已经打开的端口号
通过cmd命令控制台关闭已经打开的端口号 在出现的窗口里面输入 netstat -ano, 就会出现所有的端口号, Local Address下面的是端口号, PID就是某程序占用的进程号, 这个进程 ...
- 第07组 Beta冲刺(2/4)
队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...
- LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
1047. 删除字符串中的所有相邻重复项 1047. Remove All Adjacent Duplicates In String 题目描述 LeetCode1047. Remove All Ad ...
- Java开发笔记(一百一十六)采用UDP协议的Socket通信
前面介绍了如何通过Socket接口传输文本与文件,在示例代码中,Socket客户端得先调用connect方法连接服务端,确认双方成功连上后才能继续运行后面的代码,这种确认机制确保客户端与服务端的的确确 ...
- Vue框架 03
Vue项目开发: 前后端完全分离 后端:提供接口数据 前端:页面转跳.页面布局.页面数据渲染全部由前端做 中间交互:请求 搭建Vue项目环境: Vue项目需要自建服务器:node node介绍: 1. ...
- hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- python 读取环境变量
python 读取环境变量 前言 在使用python时候千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时. 为了保护账户信息,你需要让脚本从环境中导入敏感信息. 读取方法 import ...
- ansible-playbook的简单传参方式
基本语法: ansible-playbook -v -i myhost test.yml -e "name=xiaoming" // -v 是看运行细节.要更细节 ...