@

1.分析

当socket去监听的时候,是堵塞的状态

通过tcp_sever_socket.setblocking(False)去设置不堵塞

当socket发现没有用户的时候会出错,执行异常

当连接上用户的时候会马上把用户发到socket列表中

再遍历socket列表时候也设置,new的socket为非阻塞状态

通过和上面一样的方式

2.代码

import socket
import re def http_sever(new_socket, recv_data):
recv_data_list = recv_data.splitlines()
ret = re.match(r"[^/]+(/[^ ]*)", recv_data_list[0]) file_name = ""
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html" http_header = ""
http_body = "" try:
f = open("./html" + file_name, "rb")
except:
http_body = "<h1>Sorry not found</h1>".encode("utf-8")
http_header = "HTTP/1.1 404 NOT FOUND\r\n"
http_header += "Content-Length:%d\r\n\r\n" % len(http_body)
else:
http_body = f.read()
f.close()
http_header = "HTTP/1.1 200 OK\r\n"
http_header += "Content-Length:%d\r\n\r\n" % len(http_body) new_socket.send(http_header.encode("utf-8"))
new_socket.send(http_body) def main():
tcp_sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_sever_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcp_sever_socket.bind(("", 7890))
tcp_sever_socket.listen(128)
# 设置非堵塞
tcp_sever_socket.setblocking(False)
client_lists = list()
while True:
try:
new_socket, new_add = tcp_sever_socket.accept()
except Exception as ret:
pass
else:
# 设置非堵塞
new_socket.setblocking(False)
client_lists.append(new_socket) for client_socket in client_lists:
try:
# 尝试接收数据
recv_data = client_socket.recv(1024).decode("utf-8")
except Exception as f:
# 如果没有数据
pass
else:
# 如果有数据有两种情况,1,客户端发来了数据,2客服端下线
if recv_data:
http_sever(client_socket, recv_data)
else:
client_socket.close()
client_lists.remove(client_socket) tcp_sever_socket.close() if __name__ == '__main__':
main()

关于作者

个人博客网站

个人GitHub地址

个人公众号:

Web服务器-并发服务器-单进程单线程非堵塞方式(3.4.3)的更多相关文章

  1. web服务器-并发服务器2

    阅读目录 1.Web静态服务器-5-非堵塞模式 2.Web静态服务器-6-epoll 3.Web静态服务器-7-gevent版 4.知识扩展-C10K问题 一.Web静态服务器-5-非堵塞模式 单进程 ...

  2. Python复习笔记(十)Http协议--Web服务器-并发服务器

    1. HTTP协议(超文本传输协议) 浏览器===>服务器发送的请求格式如下:(浏览器告诉服务器,浏览器的信息) GET / HTTP/1.1 Host: www.baidu.com Conne ...

  3. 14_Web服务器-并发服务器

    1.服务器概述 1.硬件服务器(IBM,HP): 主机 集群 2.软件服务器(HTTPserver Django flask): 网络服务器,在后端提供网络功能逻辑处理数据处理的程序或者架构等 3.服 ...

  4. Web服务器-并发服务器-Epoll(3.4.5)

    @ 目录 1.介绍 2.代码 关于作者 1.介绍 epoll是一种解决方案,nginx就是用的这个 中心思想:不要再使用多进程,多线程了,使用单进程,单线程去实现并发 在上面博客实现的代码中使用过的轮 ...

  5. Web服务器-并发服务器-长连接(3.4.4)

    @ 目录 1.说明 2.代码 关于作者 1.说明 每次new_socket都被强制关闭,造成短连接 所提不要关闭套接字 但是不关闭的话,浏览器不知道发完没有啊 此时用到header的属性Content ...

  6. Web服务器-并发服务器-多进程(3.4.1)

    @ 目录 1.优化分析 2.代码 3. 关于作者 1.优化分析 在单进程的时候,相当于 是来一个客户,派一个人去服务一下 效率低,现在使用多进程来服务 假设场景 100个人同时访问页面 单进程:一次处 ...

  7. Web服务器-并发服务器-协程 (3.4.2)

    @ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...

  8. web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)

    知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...

  9. linux学习之多高并发服务器篇(一)

    高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...

随机推荐

  1. Android ALSPS驱动分析

    一.alsps的初始化函数和重要结构体 epl2182_init // Epl2182.c (kernel-3.10\drivers\misc\mediatek\alsps\epl2182-new) ...

  2. 如何在Guitar Pro上添加吉他和弦

    Guitar Pro是一款很适合广大吉他爱好者的优秀吉他谱学习与制谱软件,吉他爱好者可以使用它来更好的辅助自己学习吉他.在我们根据弹唱时,都会跟着谱子上标记的和弦来弹奏,不同的和弦有着不同的风格,或暗 ...

  3. python+selenium下载和上传文件

    操作浏览器上传文件,先看代码 1 """ 2 * send_keys() 指定文件上传路径. 3 """ 4 from selenium i ...

  4. 关于UILabel标签控件的使用小节

    前段时间一直想停下来,总结一下近期在开发中遇到的一些问题顺便分享一下解决问题的思路和方法,无奈人生就像蒲公英,看似自由却身不由己.太多的时间和精力被占用在新项目的开发和之前项目的维护中,总之一句话外包 ...

  5. activiti数据表介绍

    activiti6.0数据库介绍 Acitiviti6.0数据库中一共有28张表,表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识. 用于自我学习记录,后期不定期更新~~~ 数据库描述 ...

  6. 《STM32CubeMX配置STM32H743XI工程》第一讲《初始化UART,重定义printf函数,点亮一个LED灯》

    1.打开STM32CubeMX软件->新建一个工程(软件自行到ST官网下载安装) 2.输入对应的芯片型号(本次基于野火STM32H743XI Pro 开发板)点击Start Project生成项 ...

  7. codeforces 1424J,为了过这题,我把祖传的C++都用上了!

    大家好,我们选择的是Bubble Cup比赛Div2场次的J题,不用问我Bubble Cup是什么比赛,我也不清楚.总之是一场算法比赛就是了.可能是这个比赛知名度比较低吧,参与的人数也不是很多,我们选 ...

  8. 网络拓扑实例09:VRRP组网下同网段内配置基于全局地址池的DHCP服务器

    组网图形 DHCP服务器简介 见前面DHCP服务器文章,不再赘述. 组网需求 如图1所示,某企业内的一台主机通过Switch双归属到SwitchA和SwitchB,SwitchA为主设备,作为DHCP ...

  9. 在 Windows 中使用 C# 启动其他程序

    因为某些原因需要自动启动一个 Winform 程序,可能是因为第三方资源的原因,使用 System.Diagnostics.Process 无法成功启动 (可以看到界面,但是会报 Unhandled ...

  10. 速刷git<一> 常用命令记录

    git config  --list 列出配置  --local 对某个仓库有效  --global 对当前用户的所有仓库有效  --system 对系统所有登录用户有效git reset  --ha ...