python高级编程之 web静态服务器
返回固定数据
import socket
def request_handler(new_client_socket):
""" 响应客户端请求的核心函数 """
request_data = new_client_socket.recv(1024)
# 判断客户端是否已经断开链接
if not request_data:
print("客户端已经断开连接!")
# 关闭当前连接
new_client_socket.close()
# 退出,代码不再向后执行
return
# 开始拼接响应数据
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:Python-Web1.0\r\n"
response_blank = "\r\n"
response_content = "HelloWorld!"
# 拼接响应头
response_data = response_line + response_header + response_blank + response_content
# 发送数据
new_client_socket.send(response_data.encode())
# 关闭socket
new_client_socket.close()
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP 和端口
tcp_server_socket.bind(("", 8080))
# 设置套接字为被动套接字,主要接收客户端链接
tcp_server_socket.listen(128)
while True:
# 接受客户端链接
new_client_socket, ip_port = tcp_server_socket.accept()
print("[新客户端上线]", ip_port)
# 相应客户端请求,发送数据给客户端
request_handler(new_client_socket)
if __name__ == '__main__':
main()
返回固定页面
import socket
def request_handler(new_client_socket):
""" 响应客户端请求的核心函数 """
request_data = new_client_socket.recv(1024)
# 判断客户端是否已经断开链接
if not request_data:
print("客户端已经断开连接!")
# 关闭当前连接
new_client_socket.close()
# 退出,代码不再向后执行
return
# 开始拼接响应数据
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:Python-Web1.0\r\n"
response_blank = "\r\n"
# response_content = "HelloWorld!"
# 读取指定路径文件,并且返回
with open("static/index.html", "rb") as file:
# 读取文件的二进制数据
response_content = file.read()
# 拼接响应头
response_data = (response_line + response_header + response_blank).encode() + response_content
# 发送数据
new_client_socket.send(response_data)
# 关闭socket
new_client_socket.close()
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定IP 和端口
tcp_server_socket.bind(("", 8080))
# 设置套接字为被动套接字,主要接收客户端链接
tcp_server_socket.listen(128)
while True:
# 接受客户端链接
new_client_socket, ip_port = tcp_server_socket.accept()
print("[新客户端上线]", ip_port)
# 相应客户端请求,发送数据给客户端
request_handler(new_client_socket)
if __name__ == '__main__':
main()
协程实现多任务服务器
# 导入猴子补丁
from gevent import monkey
import socket
import re
import gevent
# 让gevent 识别普通的耗时操作,并适时切换进程
monkey.patch_all()
def request_handler(new_client_socket):
""" 响应客户端请求的核心函数 """
request_data = new_client_socket.recv(1024)
# 判断客户端是否已经断开链接
if not request_data:
print("客户端已经断开连接!")
# 关闭当前连接
new_client_socket.close()
# 退出,代码不再向后执行
return
# 目的:得到 客户端 请求行
# 对客户端请求的数据进行分析
request_data_str = request_data.decode()
# 根据”\r\n“ 分割请求头,得到存储每行请求数据的列表
request_list = request_data_str.split("\r\n")
# print(request_list)
# 使用正则 取出 请求头中的 路径部分
ret = re.search(r"\s(.*)\s", request_list[0])
if not ret:
print("用户请求报文格式错误!")
new_client_socket.close()
return
# 得到路径
path_info = ret.group(1)
print("接收到用户请求:", path_info)
# 设置默认请求页面为 index.html
if path_info == "/":
path_info = "/index.html"
response_header = "Server:Python-Web1.0\r\n"
response_blank = "\r\n"
try:
# 读取指定路径文件,并且返回
with open("static"+path_info, "rb") as file:
# 读取文件的二进制数据
response_content = file.read()
except Exception as e:
# 开始拼接响应数据
response_line = "HTTP/1.1 404 Not Found\r\n"
response_content = "Error !!! %s" % str(e)
response_content = response_content.encode()
else:
# 开始拼接响应数据
response_line = "HTTP/1.1 200 OK\r\n"
# 拼接响应头
response_data = (response_line + response_header + response_blank).encode() + response_content
# 发送数据
new_client_socket.send(response_data)
# 关闭socket
new_client_socket.close()
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定IP 和端口
tcp_server_socket.bind(("", 8080))
# 设置套接字为被动套接字,主要接收客户端链接
tcp_server_socket.listen(128)
while True:
# 接受客户端链接
new_client_socket, ip_port = tcp_server_socket.accept()
print("[新客户端上线]", ip_port)
# 相应客户端请求,发送数据给客户端
# request_handler(new_client_socket)
# 使用gevent协程处理客户端请求
g1 = gevent.spawn(request_handler, new_client_socket)
# 因为服务器一直在while True 不会退出,所以此处不用join一次
# g1.join()无锡人流哪家好 http://www.wxbhffk.com/
if __name__ == '__main__':
main()
面向对象封装
# 导入模块
import socket
import re
import gevent
from gevent import monkey
# recv() accept() time.sleep()
monkey.patch_all()
class HttpServer(object):
def __init__(self):
# 构建Tcp服务器
# 1、创建tcp的socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2、绑定ip和端口
tcp_server_socket.bind(("", 8080))
# 3、把套接字由主动设置为被动,套接字只能用于建立连接
tcp_server_socket.listen(128)
self.tcp_server_socket = tcp_server_socket
def start(self):
# 改成 while True 的目的是,让服务器端一直接收客户端请求
while True:
# 4、等待接受客户端连接
new_client_socket, ip_port = self.tcp_server_socket.accept()
print("[新客户端来了]", ip_port)
# 5、开始进行通信,响应客户端的请求
# request_handler(new_client_socket)
# 使用gevent 实现多任务
g1 = gevent.spawn(self.request_handler, new_client_socket)
@staticmethod
def request_handler(new_client_socket):
"""完成对客户端的响应"""
# 1、接受客户端发送的数据
request_data = new_client_socket.recv(1024)
# 2、判断数据是否为空,如果为空给出提示,程序退出
if not request_data:
print("客户端已断开连接!")
new_client_socket.close()
return
# 返回指定页面
# 1)、获取请求报文
request_data_str = request_data.decode()
# 2)、获取请求行
# 把请求报文用 \r\n 分割,得到一个列表,列表的每一项保存的是报文的每个协议项
request_list = request_data_str.split("\r\n")
# 3)、解析请求行中的路径部分
ret = re.search(r"\s(.*)\s", request_list[0])
if not ret:
print("用户请求报文格式错误,请重试!")
new_client_socket.close()
return
# 获取请求报文路径
path_info = ret.group(1)
# 设置默认的首页为 index.html
if path_info == "/":
path_info = "/index.html"
print("正在请求:", path_info)
# 3、拼接响应数据
# 3.1 响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 3.2 响应头
response_header = "Server:PythonWeb v1.0\r\n"
# 3.3 空行
response_blank = "\r\n"
# 3.4 响应的内容
# response_content = "HelloWorld!"
# 客户端发请求,服务器段返回 指定的页面 static/index.html
# 1) 打开文件 以读的方式打开
try:
with open("./static"+path_info, "rb") as file:
# 2) 读取文件内容
response_content = file.read()
except Exception as e:
# 请求页面不存在,需要做两件事情:1)服务器要捕获这个异常,否则服务器端就挂了 2)给客户单响应 没有找到请求页面
response_line = "HTTP/1.1 404 Not Found\r\n"
# 如果出错,设置响应的内容为 Error 信息
response_content = "Error!!!~ %s " % str(e)
# 编码
response_content = response_content.encode()
# 4、拼接响应数据,并且发送给客户端
response_data = (response_line + response_header + response_blank).encode() + response_content
new_client_socket.send(response_data)
# 5、关闭套接字
new_client_socket.close()
def main():
# 实例化对象
httpserver = HttpServer()
# 调用对象方法
httpserver.start()
# 定义程序主入口
if __name__ == '__main__':
main()
python高级编程之 web静态服务器的更多相关文章
- Python Flask高级编程之从0到1开发《鱼书》精品项目 ☝☝☝
Python Flask高级编程之从0到1开发<鱼书>精品项目 ☝☝☝ 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数 ...
- Python Flask高级编程之从0到1开发《鱼书》精品项目 ✍✍✍
Python Flask高级编程之从0到1开发<鱼书>精品项目 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移 ...
- Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)
Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享) 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...
- Python Flask高级编程之从0到1开发《鱼书》精品项目
Python Flask高级编程之从0到1开发<鱼书>精品项目 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感 ...
- python并发编程之multiprocessing进程(二)
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...
- Web静态服务器
Web静态服务器 编程微刊 Web静态服务器-1-显示固定的页面 #coding=utf-8 import socket def handle_client(client_socket): " ...
- Python网络编程之TCP套接字简单用法示例
Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...
- Nodejs实现web静态服务器对多媒体文件的支持
前几天,一个同事说他写的web静态服务器不支持音视频的播放,现简单实现一下. 原理:实现http1.1协议的range部分. 其实这一点都不神秘,我们常用的下载工具,如迅雷,下载很快,还支持断点续传, ...
- Python 多进程编程之multiprocessing--Pool
Python 多进程编程之multiprocessing--Pool ----当需要创建的子进程数量不多的时候,可以直接利用multiprocessing 中的Process 动态生成多个进程, -- ...
随机推荐
- The Best Blockchain Open Source Projects
https://101blockchains.com/blockchain-open-source/ Blockchain has been the buzzword of the year for ...
- 排序算法-冒泡排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className BubbleSort * @date 20 ...
- MacOS更改启动台(launchpad)图标大小
原文链接:https://www.jianshu.com/p/18224d191bd2作者:麦壳君 小麦有点强迫症,觉得 Mac 启动台(Launchpad)里面系统默认的应用程序图标太大,所以想让它 ...
- PATA1005Spell It Right
考虑输入为0的特殊情况 参考代码: #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<cstring> #in ...
- DJI Terra+EasyEarth让数据获取与应用无缝衔接
大数据时代对地理信息数据的获取与应用提出了更高的要求: ⏩低成本.全要素.高效获取 ⏩数据采集.处理到应用无缝衔接 DJI Terra大疆智图 DJI Terra大疆智图是一款提供自主航线规划.飞行航 ...
- Javascript报错Converting circular structure to JSON
主要是因为对象的互相引用,怎么样才能造成对象的互相引用呢? var a = {}; var b = {}; a.b = b; b.a = a; 怎么解决,反正我试了很多,最后选择深度clone thi ...
- zabbix php-fpm监控
#!/bin/bash################################### Zabbix monitoring script## php-fpm:# - anything avail ...
- WebGPU学习(七):学习“twoCubes”和“instancedCube”示例
大家好,本文学习Chrome->webgpu-samplers->twoCubes和instancedCube示例. 这两个示例都与"rotatingCube"示例差不 ...
- .net core mvc中input保留多位小数
本篇介绍:如何在mvc中使用html标签保留多位小数 你需要知道: @html标签的使用: https://blog.csdn.net/pasic/article/details/7093802 js ...
- spring cloud 服务容错保护 - Hystrix
1.为什么要断路器 在微服务架构中通常会涉及到多个服务间调用,处于调用链路底层的基础服务故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供 ...