知识点:1、使用多线程,多进程,协程完成web并发服务器 2、单进程-单线程-非堵塞也可以实现并发服务器

1、多进程和协程的代码在下面注释掉的部分,我把三种写在一起了

import socket
import re
import threading
import multiprocessing
import gevent """服务器收发数据"""
def web_server(new_socket): datas = new_socket.recv(1024).decode('utf-8') # 接收浏览器请求的数据
print(datas)
data1 = datas.splitlines()
res = re.match("[^/]+(/[^ ]*)", data1[0]) # 使用正则获取到请求头部中的的第一行中的请求地址对象
if res: # 判断如果请求地址有内容
file_name = res.group(1) # 获取正则对象中的内容
if file_name == '/': # 如果地址是‘/’,也就是请求地址后面没有带指的页面,即主页
file_name = '/index.html'
try:
data = open('./html'+file_name,'rb') # 获取请求的资源在服务器中的文件
except:
data_body = 'HTTP 404 NOT FOUND/1.1\r\n' # 服务器发送消息的头部需要换行,用\r\n
data_body += '\r\n' # 头部和body需要空一行
data_body += '<h1>not found</h1>' # 服务器没找到浏览器需要的资源,返回的html页面
new_socket.send(data_body.encode('utf-8')) # 发送给浏览器
else:
data_head = 'HTTP 200 OK/1.1\r\n' # 请求成功,服务器返回200
data_head += '\r\n'
data_body = data.read()
data.close() # 关闭文件
new_socket.send(data_head.encode('utf-8'))
new_socket.send(data_body)
new_socket.close() # 关闭新的客户端套接字 """主程序入口"""
def main():
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 防止下一次使用该服务器端口被占用情况
tcp_socket.bind(('127.0.0.1', 7789)) # 服务器绑定地址和端口
tcp_socket.listen(128) # 监听套接字
while True:
new_socket, adrees = tcp_socket.accept()
# 1、多进程实现并发服务
# p = multiprocessing.Process(target=web_server, args=(new_socket,))
# p.start() # 2、协程实现并发服务
# p = gevent.spawn(web_server, new_socket)
# p.start() # 3、多线程实现并发服务
t = threading.Thread(target=web_server, args=(new_socket,))
t.start()
t.join()
new_socket.close()
tcp_socket.close() # 关闭监听套接字
if __name__ == '__main__':
main()
运行效果:
浏览器访问本地,会显示一个界面,而且可以开多个浏览器一起运行

2、单进程-单线程-非堵塞也可以实现并发服务器

"""利用单进程-单线程-非堵塞也可以实现web并发服务(即不用多线程,多进程,协程)
思路:1、设置套接字为非堵塞
2、在接收客户端处:因为是非堵塞,所以要捕捉异常,当有客户端进来,新客户端的套接字也要设置非堵塞
还需要判断接recv是否是有数据,没有数据说明客户端断开连接,关闭套接字 """ def main():
main_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
main_socket.bind(('127.0.0.1',7785))
main_socket.listen(128)
main_socket.setblocking(False)
socket_list = list()
while True:
time.sleep(1)
try:
new_socket,new_adress = main_socket.accept()
except:
print('没有客户端进来,请稍等.....')
else:
print('一个新的客户端进来了......')
new_socket.setblocking(False)
socket_list.append(new_socket)
for client in socket_list:
try:
recv_data = client.recv(1024).decode('utf-8')
except:
print('客户端没有发送过来数据')
else:
print('无异常')
if recv_data:
print('客户端发来了消息')
print(recv_data)
data1 = recv_data.splitlines()
res = re.match("[^/]+(/[^ ]*)", data1[0])
if res:
file_name = res.group(1)
print('--------------' + res.group(1))
if file_name == '/':
file_name = '/index.html'
try:
data = open('./html' + file_name, 'rb')
except:
data_body = 'HTTP 404 NOT FOUND/1.1\r\n'
data_body += '\r\n'
data_body += '<h1>not found</h1>'
client.send(data_body.encode('utf-8'))
else:
data_body = data.read()
data.close()
data_head = 'HTTP 200 OK/1.1\r\n'
data_head += 'Content-Length:%d\r\n' % len(data_body)
data_head += '\r\n'
reponse = (data_head.encode('utf-8')+data_body)
client.send(reponse)
else:
client.close()
socket_list.remove(client)
main_socket.close() if __name__ == '__main__':
main()

web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)的更多相关文章

  1. web服务-3、epoll高效率实现并发服务器

    知识点: 之前写的四种方法实现并发服务效率都还是低,早期的服务器采用的是select和poll方式,select这种方式的特点是轮询所有套接字去一个个看有没有事件发生,但是装套接字的列表长度是有限制的 ...

  2. Python并发编程——多线程与协程

    Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...

  3. Tomcat中部署WEB项目的四种方法

    对Tomcat部署web应用的方式总结,常见的有以下四种: 1.[使用控制台部署] 访问Http://localhost:8080,并通过Tomcat Manager登录,进入部署界面即可. 2.[利 ...

  4. [Web 前端] 018 css 清除浮动的四种方法

    清除浮动的四种方法 加 clear: ...(见例1) 父级上增加属性 overflow:hidden(见例2.1) 在最后一个子元素的后面加一个空的 div,给它一个样式属性 clear: both ...

  5. Tomcat系列(11)——Tomcat 部署web应用的4种方法

    核心内容 1.在Tomcat中有四种部署Web应用的方式,分别是: (1)利用Tomcat自动部署(项目直接拷贝OR WAR包拷贝 到webapps下) (2)利用控制台进行部署(tomcat的man ...

  6. 使用Spring Security3的四种方法概述

    使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...

  7. Springboot 优雅停止服务的几种方法

    在使用Springboot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接退出 ...

  8. ASP.NET 使用 Dispose 释放资源的四种方法

    Dispose 和 Finalize 是运行的 .NET 和 .NET Core 应用程序释放占用的资源的两种方法.通常,如果应用程序中有非托管资源,应该显式地释放这些资源占用的资源. 由于 Fina ...

  9. linux下配置ip地址四种方法(图文方法)

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

随机推荐

  1. FastDFS分布式文件系统客户端安装

    软件安装前提:服务器已配置好LNMP环境安装libfastcommon见FastDFS服务器安装文档(http://www.cnblogs.com/Mrhuangrui/p/8316481.html) ...

  2. ADO.NET中的五大内置对象

    ADO.NET中的五大内置对象 学习链接:https://blog.csdn.net/wxr15732623310/article/details/51828677

  3. SQL随记(三)

    1.关于package: 包的作用:可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放入包中,相当于一个容器. 包的好处:在包中的(过程,函数,游标,游标,类型,变量)相当于sql/ ...

  4. 金融量化分析【day112】:初识量化交易

    一.摘要 为什么需要量化交易? 量化交易是做什么? 量化交易的价值何在? 做量化交易需要什么? 聚宽是什么? 零基础如何快速入门量化交易? 自测与自学 二.量化交易比传统交易强多少? 它能让你的交易效 ...

  5. Tomcat设计模式

    omcat 系统架构与设计模式,第 2 部分 设计模式分析 系列内容: 此内容是该系列 2 部分中的第 2 部分: Tomcat 系统架构与设计模式 门面设计模式 门面设计模式在 Tomcat 中有多 ...

  6. LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001

    数的计算(数的计数) 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n).先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上 ...

  7. LCA(ST倍增)

    时间复杂度: dfs树,求st表(状态数组f):O(NlgN) 处理M个查询:O(MlgN) 总:O((M+N)lgN) #include<iostream> #include<cs ...

  8. 第十二节: EF的三种模式(二) 之 ModelFirst模式(SQLServer为例)

    一. 简介  顾名思义,ModelFirst是模型优先,是DBFirst的逆向模式,先建立实体数据模型,然后根据实体数据模型来生成数据库,从而驱动整个开发流程.(生成一个空的edmx文件,手动在里面建 ...

  9. JavaScript数据类型 Boolean布尔类型

    前言 布尔值Boolean类型可能是三种包装对象Number.String和Boolean中最简单的一种.Number和String对象拥有大量的实例属性和方法,Boolean却很少.从某种意义上说, ...

  10. HTML(三)HTML属性

    HTML 属性 属性: [class] 规定元素的一个或多个类 注意: 类不能以数字开头 class = "classA classB" // 多个类的写法 [id] 规定元素的唯 ...