在对服务器实现web服务的时候,面对多个用户的请求时,我们可以采取多进程或者多线程。
下面是他们的实现代码:
import urllib.request
import multiprocessing
import re
import socket
def service_client(new_socket):
"""为客户端服务"""
# 接受浏览器发过来的请求
request = new_socket.recv(1024).decode("utf-8")
# 返回http格式的数据,给浏览器
request_lines = request.splitlines()
ret= re.match(r"[^/]+(/[^ ]*)",request_lines[0])
if ret:
file_name = ret.group(1)
try:
f = open("./html/index.html","rb")
except:
response = "HTTP/1.1 404 NO FOUND\r\n"
response +="\r\n"
response += "--------file not found----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 ok\r\n"
response+="\r\n"
new_socket.send(response.encode("utf-8"))
new_socket.send(html_content)
new_socket.close()
def http_serve():
# 创建socket
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定
tcp_socket.bind(("",7788))
# 监听套接字
tcp_socket.listen(128)
# 等待客户端的连接
while True:
new_socket,client_addr = tcp_socket.accept()
# 为这个客户端服务
p = multiprocessing.Process(target=service_client,args=(new_socket,))
p.start()
new_socket.close()
tcp_socket.close()
if __name__=="__main__":
http_serve()
多线程和多进程代码差不多就不一一贴出了,但是今天主要是想谈一下另一种实现的方式就是协程gevent。协程相比进程和线程而言,用的资源更少,效率更高。
代码如下:
import urllib.request
import multiprocessing
import re
import socket
import gevent
from gevent import monkey
monkey.path_all()
def service_client(new_socket):
"""为客户端服务"""
# 接受浏览器发过来的请求
request = new_socket.recv(1024).decode("utf-8")
# 返回http格式的数据,给浏览器
request_lines = request.splitlines()
ret= re.match(r"[^/]+(/[^ ]*)",request_lines[0])
if ret:
file_name = ret.group(1)
try:
f = open("./html/index.html","rb")
except:
response = "HTTP/1.1 404 NO FOUND\r\n"
response +="\r\n"
response += "--------file not found----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 ok\r\n"
response+="\r\n"
new_socket.send(response.encode("utf-8"))
new_socket.send(html_content)
new_socket.close()
def http_serve():
# 创建socket
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定
tcp_socket.bind(("",7788))
# 监听套接字
tcp_socket.listen(128)
# 等待客户端的连接
while True:
new_socket,client_addr = tcp_socket.accept()
# 为这个客户端服务
gevent.spawn(service_client,new_socket)
new_socket.close()
tcp_socket.close()
if __name__=="__main__":
http_serve()