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从入门到精通(DAY 1)
Dec 20 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
python实现日志按天分割
Jul 22 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
python源文件的字符编码知识点详解
Mar 04 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和ACCESS写聊天室(四)
2006/10/09 PHP
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
python使用PyFetion来发送短信的例子
2014/04/22 Python
python使用opencv读取图片的实例
2017/08/17 Python
python psutil库安装教程
2018/03/19 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
基于python图像处理API的使用示例
2020/04/03 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
介绍一下linux文件系统分配策略
2013/02/25 面试题
中学校庆方案
2014/03/17 职场文书
市场部经理岗位职责
2014/04/10 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
优秀团员事迹材料
2014/12/25 职场文书
检讨书大全
2015/01/27 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
在Docker容器中部署SQL Server
2022/04/11 Servers