目录

Web静态服务器-5-非堵塞模式

单进程非堵塞 模型

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

单进程、线程、非堵塞


Web静态服务器-5-非堵塞模式

单进程非堵塞 模型

#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:passelse: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:passprint(g_socket_list)  # for testif __name__ == '__main__':main()

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

import time
import socket
import sys
import reclass 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_rootdef run_forever(self):"""运行服务器"""# 等待对方链接while True:# time.sleep(0.5)  # for testtry:new_socket, new_addr = self.server_socket.accept()except Exception as ret:print("-----1----", ret)  # for testelse: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 testelse: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:returnrequest_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.1ret = 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 = contentresponse_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 7890if len(sys.argv) == 2:port = sys.argv[1]if port.isdigit():port = int(port)else:print("运行方式如: python3 xxx.py 7890")returnprint("http服务器使用的port:%s" % port)http_server = WSGIServer(port, DOCUMENTS_ROOT)http_server.run_forever()if __name__ == "__main__":main()

单进程单线程实现监听多个socket

但如果按这个程序的思想,当有很多个客户端时,在响应遍历时会等的时间越来越长,这样程序就越来越慢。所以可以当服务完的客户端在列表中删除。

单进程、线程、非堵塞

import socket
import timetcp_server_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_tcp.bind(("", 7899))
tcp_server_tcp.listen(128)
tcp_server_tcp.setblocking(False)  # 设置套接字为非堵塞的方式client_socket_list = list()while True:# time.sleep(0.5)try:new_socket, new_addr = tcp_server_tcp.accept()except Exception as ret:print("---没有新的客户端到来---")else:print("---只要没有产生异常,那么也就意味着 来了一个新的客户端----")new_socket.setblocking(False)  # 设置套接字为非堵塞的方式client_socket_list.append(new_socket)for client_socket in client_socket_list:try:recv_data = client_socket.recv(1024)except Exception as ret:print(ret)print("----这个客户端没有发送过来数据----")else:print("-----没有异常-----")print(recv_data)if recv_data:# 对方发送过来数据print("----客户端发送过来了数据-----")else:# 对方调用close 导致了 recv返回client_socket.close()client_socket_list.remove(client_socket)print("---客户端已经关闭----")

黑马程序员 (重要)单进程、线程、非堵塞实现并发的原理相关推荐

  1. 最近整理的一些常见的面试题,面试大全,黑马程序员面试宝典题库---最新技术--篇

    第八章 最新技术(评论区留言获取原件) 一. Redis 1. Redis 的特点? Redis 是由意大利人 Salvatore Sanfilippo(网名: antirez)开发的一款内存高速缓存 ...

  2. 黑马程序员入学Java知识——精华总结

    黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...

  3. 黑马程序员:Java基础总结----Java语言编程规范

       黑马程序员:Java基础总结        Java语言编程规范:参考自SUN公司文档  ASP.Net+Android+IO开发..Net培训.期待与您交流!  I.   排版规范 A.  规 ...

  4. [学习笔记]黑马程序员-Hadoop入门视频教程

    文章目录 参考资料 第一章:大数据导论与Linux基础(p1-p17) 1.1 大数据导论 1.1.1 企业数据分析方向 1.1.2 数据分析基本流程步骤 明确分析的目的和思路 数据收集 数据处理 数 ...

  5. 跟着黑马程序员pink老师学习的笔记及小破站学习的笔记

    网页 1.网站是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合 2.什么是网页? 网页是网站中的一"页",通常是HTML格式的文件,它要通过浏览器来 ...

  6. 黑马程序员训练营十道满分题解

    黑马程序员训练营基础测试题十道 代码下载见GitHubs:https://github.com/fairyxingyun/Itheima_exam_10_answer 1. 编写一个函数,函数内输出一 ...

  7. 远程字典服务Redis,感谢B站黑马程序员,多多三连

    目录 1.数据存储的解决方案(电商场景) 2.远程字典服务Redis介绍 2.1 基本操作 2.2 数据存储类型 3.数据类型 3.1 string 3.1.1 string类型数据基本操作 3.1. ...

  8. 黑马程序员_异常(老毕视频总结及《疯狂java》补充)

    ----------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+A ...

  9. [学习笔记]黑马程序员python教程

    文章目录 思维导图 Python基础知识图谱 面向对象 SQL入门和实战 Python高阶技巧 第一阶段 第九章:Python异常.模块与包 1.9.1异常的捕获 1.9.1.1 为什么要捕获异常 1 ...

  10. python视频教程黑马-python视频教程免费:求黑马程序员python教程?

    python后端开发需要学什么? 第一阶段:Python语言基础 主习Python最基识,如Python3.数据类型.字符串.函数.类件操作等.阶段课程结束后,学员需要完成Pygame实战飞机大战.2 ...

最新文章

  1. Asakura的魔法世界
  2. 如何使CPU占用率为50%
  3. Bootstrap全局css样式_表单
  4. 自定义UISlider的样式和滑块
  5. Java JTable3
  6. 读书笔记-说服力 让你的PPT会说话
  7. 【C语言】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,a说他不和x比,c说他不和x,z比,编写程序找出三对赛手名单。...
  8. Python——eventlet.greenpool
  9. c++list遍历_小白学PyTorch | 6 模型的构建访问遍历存储(附代码)
  10. 使用ELK实时分析SSH暴力破解
  11. 4.3.1深度定时器(Timer in Depth)
  12. Qt 3D Opengl学习
  13. OpenWrt路由器通过Aria2开启迅雷离线下载[图文教程]
  14. 初始Pytorch框架
  15. 【usaco 2013 feb Bronze】计算周长
  16. 【Blender】Blender全按键解析 01(目前咕咕咕了)
  17. 原来这才是睿至大数据的业务拼图
  18. 联想y7000p麦克风插上耳机声音太小的问题
  19. 指针:C语言二级指针与二维数组
  20. MacBook+eGPU编译安装pytorch、tensorflow(OSX10.13.3,python3.6,cuda9.1,cudnn7)(未完成)

热门文章

  1. c++数组排序_为什么?为什么?Java处理排序后的数组比没有排序的快?想过没有?
  2. 计算机虚拟仪器技术与测试技术相关的概念,虚拟测试技术概念辨析.pdf
  3. Mismatch between array dtype (‘<U40‘) and format specifier (‘%.18e‘)
  4. 超神学院暗物质计算机,超神学院之进击的赛亚人
  5. 可视化排班管理_人事工资管理系统就选i人事,提升算薪效率聚焦战略决策
  6. 计算机怎么给课程表涂颜色,Excel做自动统计课时数的彩色课程表
  7. 青海师大有没有计算机系,计算机专业选择:北交、重邮实力强劲,青海师大性价比不错...
  8. 不同计算机系统数据表示,计算机系统基础--第二章(数据的机器级表示与处理)...
  9. 说说PMO 的工作思路
  10. JavaScript—常见设计模式整理(27)