您的位置:首页 > 编程语言 > Python开发

python利用面向对象,协程开发web后端服务器

2017-11-21 16:40 435 查看
web后端入门级别!

开发语言:

python3

模块:

gevent os re socket

编辑器:

博主用的 vim

简介:

我们这里是利用了python最基础的知识来实现得网站后端,所以比较容易理解,代码里的”static”是博主本地的文件夹,文件夹内存放了一些html文件和图片,都可以通过ip+文件名来进行访问.

# 导入gevent的monkey模块,破解具有阻塞功能的方法
from gevent import monkey
monkey.patch_all()
import gevent
import os
import re
import socket

class HTTPServer(object):
"""创建服务器类"""
def __init__(self):
# 创建套接字
self.tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置端口重用
self.tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 固定端口号
self.tcp_socket.bind(("", 5566))
# 转换为被动套接字
self.tcp_socket.listen(128)

def deal_request(self,client_socket):
# 接受客户端请求
data = client_socket.recv(4096)
# 分割客户端请求行,请求头
data_list = data.decode().split("\r\n")
# 打印分割完成的列表
print(data_list)
# 匹配请求行内的请求路径
match_str = re.match(r"\w+\s+(\S+)",data_list[0])
# 通过分组获取请求路径
match_str = match_str.group(1)
# 如果为空直接关闭
if not match_str:
client_socket.close()
print("请求错误")
return
# 如果为/默认转换为/index.html
if match_str == "/":
match_str = "/index.html"

try:
# 打开文件 读取内容 关闭文件
file1 = open("static"+match_str,"rb")
file_data = file1.read()
file1.close()

except:
# 如果文件不存在服务器回复404
response_line = "HTTP/1.1 404 NOT FOUND\r\n"
response_header = "Server: bfe/1.0.8.13-sslpol-patch\r\n\r\n"
response_body = response_line + response_header + "404错误"
client_socket.sendall(response_body.encode("gbk"))
else:
# 如果文件存在回复200 并发送文件内容为响应体
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server: bfe/1.0.8.13-sslpol-patch\r\n\r\n"
response_body = response_line + response_header
client_socket.sendall(response_body.encode()+file_data)
finally:
# 关闭套接字
client_socket.close()

def run(self):
while True:
# 从等待队列中取出
client_socket, client_ip = self.tcp_socket.accept()
# 创建并启动套接字
son = gevent.spawn(self.deal_request,client_socket)

def main():
# 创建服务器类
server = HTTPServer()
server.run()

if __name__ == "__main__":
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息