Python Web静态服务器非堵塞模式实现方法示例


Posted in Python onNovember 21, 2019

本文实例讲述了Python Web静态服务器非堵塞模式实现方法。分享给大家供大家参考,具体如下:

单进程非堵塞 模型

#coding=utf-8
from socket import *
import time
# 用来存储所有的新链接的socket
g_socket_list = list()
def main():
  server_socket = socket(AF_INET, SOCK_STREAM)
  server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
  server_socket.bind(('', 7890))
  server_socket.listen(128)
  # 将套接字设置为非堵塞
  # 设置为非堵塞后,如果accept时,恰巧没有客户端connect,那么accept会
  # 产生一个异常,所以需要try来进行处理
  server_socket.setblocking(False)
  while True:
    # 用来测试
    time.sleep(0.5)
    try:
      newClientInfo = server_socket.accept()
    except Exception as result:
      pass
    else:
      print("一个新的客户端到来:%s" % str(newClientInfo))
      newClientInfo[0].setblocking(False) # 设置为非堵塞
      g_socket_list.append(newClientInfo)
    for client_socket, client_addr in g_socket_list:
      try:
        recvData = client_socket.recv(1024)
        if recvData:
          print('recv[%s]:%s' % (str(client_addr), recvData))
        else:
          print('[%s]客户端已经关闭' % str(client_addr))
          client_socket.close()
          g_socket_list.remove((client_socket,client_addr))
      except Exception as result:
        pass
    print(g_socket_list) # for test
if __name__ == '__main__':
  main()

web静态服务器-单进程非堵塞

import time
import socket
import sys
import re
class WSGIServer(object):
  """定义一个WSGI服务器的类"""
  def __init__(self, port, documents_root):
    # 1. 创建套接字
    self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2. 绑定本地信息
    self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.server_socket.bind(("", port))
    # 3. 变为监听套接字
    self.server_socket.listen(128)
    self.server_socket.setblocking(False)
    self.client_socket_list = list()
    self.documents_root = documents_root
  def run_forever(self):
    """运行服务器"""
    # 等待对方链接
    while True:
      # time.sleep(0.5) # for test
      try:
        new_socket, new_addr = self.server_socket.accept()
      except Exception as ret:
        print("-----1----", ret) # for test
      else:
        new_socket.setblocking(False)
        self.client_socket_list.append(new_socket)
      for client_socket in self.client_socket_list:
        try:
          request = client_socket.recv(1024).decode('utf-8')
        except Exception as ret:
          print("------2----", ret) # for test
        else:
          if request:
            self.deal_with_request(request, client_socket)
          else:
            client_socket.close()
            self.client_socket_list.remove(client_socket)
      print(self.client_socket_list)
  def deal_with_request(self, request, client_socket):
    """为这个浏览器服务器"""
    if not request:
      return
    request_lines = request.splitlines()
    for i, line in enumerate(request_lines):
      print(i, line)
    # 提取请求的文件(index.html)
    # GET /a/b/c/d/e/index.html HTTP/1.1
    ret = re.match(r"([^/]*)([^ ]+)", request_lines[0])
    if ret:
      print("正则提取数据:", ret.group(1))
      print("正则提取数据:", ret.group(2))
      file_name = ret.group(2)
      if file_name == "/":
        file_name = "/index.html"
    # 读取文件数据
    try:
      f = open(self.documents_root+file_name, "rb")
    except:
      response_body = "file not found, 请输入正确的url"
      response_header = "HTTP/1.1 404 not found\r\n"
      response_header += "Content-Type: text/html; charset=utf-8\r\n"
      response_header += "Content-Length: %d\r\n" % (len(response_body))
      response_header += "\r\n"
      # 将header返回给浏览器
      client_socket.send(response_header.encode('utf-8'))
      # 将body返回给浏览器
      client_socket.send(response_body.encode("utf-8"))
    else:
      content = f.read()
      f.close()
      response_body = content
      response_header = "HTTP/1.1 200 OK\r\n"
      response_header += "Content-Length: %d\r\n" % (len(response_body))
      response_header += "\r\n"
      # 将header返回给浏览器
      client_socket.send( response_header.encode('utf-8') + response_body)
# 设置服务器服务静态资源时的路径
DOCUMENTS_ROOT = "./html"
def main():
  """控制web服务器整体"""
  # python3 xxxx.py 7890
  if len(sys.argv) == 2:
    port = sys.argv[1]
    if port.isdigit():
      port = int(port)
  else:
    print("运行方式如: python3 xxx.py 7890")
    return
  print("http服务器使用的port:%s" % port)
  http_server = WSGIServer(port, DOCUMENTS_ROOT)
  http_server.run_forever()
if __name__ == "__main__":
  main()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之复习if语句
Oct 02 Python
linux 下实现python多版本安装实践
Nov 18 Python
python并发2之使用asyncio处理并发
Dec 21 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
Pythony运维入门之Socket网络编程详解
Apr 15 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
用Python可视化新冠疫情数据
Jan 18 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 #Python
使用python代码进行身份证号校验的实现示例
Nov 21 #Python
Python 面向对象之封装、继承、多态操作实例分析
Nov 21 #Python
用python画一只可爱的皮卡丘实例
Nov 21 #Python
Python 私有化操作实例分析
Nov 21 #Python
使用python的turtle绘画滑稽脸实例
Nov 21 #Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 #Python
You might like
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
js tab效果的实现代码
2009/12/26 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python实现下载文件的三种方法
2017/02/09 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
python配置文件写入过程详解
2019/10/19 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
西安交大自主招生自荐信
2014/01/27 职场文书
情人节活动策划方案
2014/02/27 职场文书
工作求职自荐信
2014/06/13 职场文书
义和团口号
2014/06/17 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
行政经理岗位职责
2015/04/15 职场文书
初中数学教学随笔
2015/08/15 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
Python基础知识之变量的详解
2021/04/14 Python