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实现决策树
Dec 21 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
Django获取应用下的所有models的例子
Aug 30 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
Python的logging模块基本用法
Dec 24 Python
pycharm 的Structure界面设置操作
Feb 05 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
python实现简单的聊天小程序
Jul 07 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
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python里隐藏的“禅”
2014/06/16 Python
python中append实例用法总结
2019/07/30 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
求网格中的黑点分布
2013/11/06 面试题
初中生自我鉴定
2014/02/04 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
餐饮营销方案
2014/02/23 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
2015年班组长工作总结
2015/04/10 职场文书
公司捐书倡议书
2015/04/27 职场文书
幽默导游词开场白
2015/05/29 职场文书
python基础入门之字典和集合
2021/06/13 Python
Python几种酷炫的进度条的方式
2022/04/11 Python
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python