01-静态web服务器(Python)-面向对象的对比
普通写法,静态web服务器:
- 先创建TCP服务器套接字,然后等待客户端(这里是浏览器)请求连接。
- 客户端发起请求,用线程来处理连接的建立,这样可以实现多任务(也就是并发)
- 连接后根据请求发送指定页面
补充:设置守护主线程:当主线程退出,子线程立马全死
1 import socket
2 import os
3 import threading
4
5 # 处理客户端的请求
6 def handle_client_request(new_socket):
7 # 代码执行到此,说明连接建立成功
8 # 连接客户端的请求信息
9 recv_data = new_socket.recv(4096)
10 # 判断接收到的数据长度是否为0
11 if len(recv_data) == 0: # 用来解决客户端一连接服务器就关闭的现象
12 new_socket.close()
13 return
14
15 # 对二进制数据进行解码
16 recv_content = recv_data.decode("UTF-8")
17 print(recv_data)
18
19 # 对数据按照空格进行分割(maxsplit=2表示分割两次,得到3个。其格式为元组)
20 request_list = recv_content.split(" ", maxsplit=2)
21 # 获取请求的资源路径
22 request_path = request_list[1]
23 print(request_path)
24
25 # 判断请求的是否是根目录,如果是根目录设置返回的信息
26 if request_path == "/":
27 request_path = "/index.html"
28
29 # 判断该路径的文件是否存在,有两种方法
30 # 方法一:os.path.exists
31 # os.path.exists("static/" + request_path)
32 # 方法二:try-except异常抛出的4件套
33
34 try:
35 # 打开文件读取文件中的数据,提示:这里使用rb模式,兼容打开图片文件(用二进制的方式)
36 with open("static" + request_path, "rb") as file: # 这里的file表示打开文件的对象
37 file_data = file.read()
38 # 提示:with open 关闭文件这步操作不用程序来完成,系统帮我们完成
39
40 except Exception as e:
41 # 代码执行到此,说明没有请求的该文件,返回404状态信息
42 # 响应行
43 response_line = "HTTP/1.1 404 Not Found\r\n"
44 # 响应头
45 response_header = "Server:PWS/1.0\r\n"
46 # 空行
47
48 # 读取404页面数据
49 with open("static/error.html", "rb") as file:
50 file_data = file.read()
51 # 响应体
52 response_body = file_data
53
54 # 把数据封装成http,响应报文格式的数据
55 response = (response_line +
56 response_header +
57 "\r\n").encode("UTF-8") + response_body
58
59 # 发送给浏览器的响应报文数据
60 new_socket.send(response)
61
62 else:
63 # 代码执行到此,说明文件存在,返回200状态信息
64 # 响应行
65 response_line = "HTTP/1.1 200 OK\r\n"
66 # 响应头
67 response_header = "Server: pws/1.0\r\n"
68 # 空行
69 # 响应体
70 response_body = file_data
71
72 # 把数据封装成http,响应报文格式的数据
73 response = (response_line +
74 response_header +
75 "\r\n").encode("UTF-8") + response_body # 响应行/头是字符串,响应体是二进制。
76 # 这里把响应行/头也改成二进制,再连接起来
77 # 发送给浏览器的响应报文数据
78 new_socket.send(response)
79
80 finally:
81 # 关闭服务于客户端的套接字
82 new_socket.close()
83
84
85 def main():
86 # 创建TCP服务器套接字
87 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
88 # 设置端口号复用,程序退出端口号立即释放
89 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
90 # 绑定端口号
91 tcp_server_socket.bind(("", 8000))
92 # 设置监听
93 tcp_server_socket.listen(128)
94 # 循环等待接受客户端的连接请求
95 while True:
96 # 等待接受客户端的连接请求
97 new_socket, ip_port = tcp_server_socket.accept()
98 # 当客户端和服务器建立连接,创建子线程
99 sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))
100 # 设置守护主线程
101 sub_thread.setDaemon(True)
102 # 启动子线程执行的对应任务
103 sub_thread.start()
104
105
106 if __name__ == '__main__':
107 main()
面向对象的写法:
- 用类进行封装,
- TCP服务器套接字直接写在__init__里面,这样默认就会创建
1 import socket
2 import os
3 import threading
4
5
6 # Http协议的web服务器类
7 class HttpWebServer(object):
8 def __init__(self):
9 # 创建TCP服务器套接字
10 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11 # 设置端口号复用,程序退出端口号立即释放
12 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
13 # 绑定端口号
14 tcp_server_socket.bind(("", 8000))
15 # 设置监听
16 tcp_server_socket.listen(128)
17 # 把TCP服务器的套接字做为web服务器对象的属性
18 self.tcp_server_socket = tcp_server_socket
19
20 # 处理客户端请求
21 @staticmethod
22 def handle_client_request(new_socket):
23 # 代码执行到此,说明连接建立成功
24 # 连接客户端的请求信息
25 recv_data = new_socket.recv(4096)
26 # 判断接收到的数据长度是否为0
27 if len(recv_data) == 0: # 用来解决客户端一连接服务器就关闭的现象
28 new_socket.close()
29 return
30
31 # 对二进制数据进行解码
32 recv_content = recv_data.decode("UTF-8")
33 print(recv_data)
34
35 # 对数据按照空格进行分割(maxsplit=2表示分割两次,得到3个。其格式为元组)
36 request_list = recv_content.split(" ", maxsplit=2)
37 # 获取请求的资源路径
38 request_path = request_list[1]
39 print(request_path)
40
41 # 判断请求的是否是根目录,如果是根目录设置返回的信息
42 if request_path == "/":
43 request_path = "/index.html"
44
45 # 判断该路径的文件是否存在,有两种方法
46 # 方法一:os.path.exists
47 # os.path.exists("static/" + request_path)
48 # 方法二:try-except异常抛出的4件套
49
50 try:
51 # 打开文件读取文件中的数据,提示:这里使用rb模式,兼容打开图片文件(用二进制的方式)
52 with open("static" + request_path, "rb") as file: # 这里的file表示打开文件的对象
53 file_data = file.read()
54 # 提示:with open 关闭文件这步操作不用程序来完成,系统帮我们完成
55
56 except Exception as e:
57 # 代码执行到此,说明没有请求的该文件,返回404状态信息
58 # 响应行
59 response_line = "HTTP/1.1 404 Not Found\r\n"
60 # 响应头
61 response_header = "Server:PWS/1.0\r\n"
62 # 空行
63
64 # 读取404页面数据
65 with open("static/error.html", "rb") as file:
66 file_data = file.read()
67 # 响应体
68 response_body = file_data
69
70 # 把数据封装成http,响应报文格式的数据
71 response = (response_line +
72 response_header +
73 "\r\n").encode("UTF-8") + response_body
74
75 # 发送给浏览器的响应报文数据
76 new_socket.send(response)
77
78 else:
79 # 代码执行到此,说明文件存在,返回200状态信息
80 # 响应行
81 response_line = "HTTP/1.1 200 OK\r\n"
82 # 响应头
83 response_header = "Server: pws/1.0\r\n"
84 # 空行
85 # 响应体
86 response_body = file_data
87
88 # 把数据封装成http,响应报文格式的数据
89 response = (response_line +
90 response_header +
91 "\r\n").encode("UTF-8") + response_body # 响应行/头是字符串,响应体是二进制。
92 # 这里把响应行/头也改成二进制,再连接起来
93 # 发送给浏览器的响应报文数据
94 new_socket.send(response)
95
96 finally:
97 # 关闭服务于客户端的套接字
98 new_socket.close()
99
100 # 启动服务器的方法
101 def start(self):
102 # 循环等待接受客户端的连接请求
103 while True:
104 # 等待接受客户端的连接请求
105 new_socket, ip_port = self.tcp_server_socket.accept()
106 # 当客户端和服务器建立连接,创建子线程
107 sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
108 # 设置守护主线程
109 sub_thread.setDaemon(True)
110 # 启动子线程执行的对应任务
111 sub_thread.start()
112
113 def main():
114 # 创建web服务器
115 web_server = HttpWebServer()
116 # 启动服务器
117 web_server.start()
118
119 if __name__ == '__main__':
120 main()
01-静态web服务器(Python)-面向对象的对比的更多相关文章
- Python之HTTP静态Web服务器开发
众所周知,Http协议是基于Tcp协议的基础上产生的浏览器到服务器的通信协议 ,其根本原理也是通过socket进行通信. 使用HTTP协议通信,需要注意其返回的响应报文格式不能有任何问题. 响应报文, ...
- python网络-静态Web服务器案例(29)
一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...
- 04-HTTP协议和静态Web服务器
一.HTTP协议(HyperText Transfer Protocol) 超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...
- 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 控制 ...
- 用HTTP核心模块配置一个静态Web服务器
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module.n ...
- node 创建静态web服务器(下)(处理异步获取数据的两种方式)
接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...
- node 创建静态web服务器(上)
声明:本文仅用来做学习记录. 本文将使用node创建一个简单的静态web服务器. 准备工作: 首先,准备好一个类似图片中这样的页面 第一步: 创建 http 服务: const http = requ ...
随机推荐
- Linux 驱动框架---驱动中的并发
并发指多个执行单元被同时.并行的执行,而并发执行的单元对共享资源的访问就容易导致竟态.并发产生的情况分为抢占和并行(多核)和硬抢占(中断).Linux为解决这一问题增加了一系列的接口来解决并发导致的竟 ...
- μC/OS-III---I笔记3---时间管理
时间管理相关函数,其实深入根本的理解就是一些对时间任务相关变量,数据结果进行修改的函数这样方便对应任务查找延时等时间相关的任务有没有到期.前面的时间相关的函数是这些操作的基 1.延时函数 OsTIme ...
- php foundation knowledge!
php foundation knowledge! 1 <?php 2 $p = "PII"; 3 define("XPI",3.1415926); 4 ...
- Vue 组件之间通信 All in One
Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...
- free online markdown editor
free online markdown editor markdown https://blog.csdn.net/xgqfrms/article/details/50129317 In-brows ...
- 移动端 CSS 1px 问题及解决方案
移动端 CSS 1px 问题及解决方案 viewport & transfrom: scale viewport 的 initial-scale 设为 1 UI 设计稿用rem 和 trans ...
- shit 环信 IM SDK & IM SDK & web
shit 环信 IM SDK & IM SDK & web 环信 IM SDK, 采坑大全 自己写 UI appkey 是否正确 password 是字符串,不是 数字 HTTPS 是 ...
- macOS utils
macOS utils dr.unarchiver https://dr-unarchiver.en.softonic.com/mac https://dr-unarchiver.en.softoni ...
- git merge all in one
git merge all in one you can follow below steps 1. merge origin/master branch to feature branch # st ...
- 1月加密货币交易所访问量破3亿!NGK生态星空计划、NGK生态所带来双重利好!
据最新数据显示,2021年一月份,加密货币交易所网站的访问量急剧上升.约有3.44亿访问者涌入了加密货币交易所,超过2020年12月的1.96亿访问者总数,创2018年1月以来新高. 加密货币交易所网 ...