python网络编程之web服务器
python编写web服务器时,首要考虑服务器的高并发问题以及减少服务器开销问题,本次编写方案主要利用多线程和长连接实现,详细介绍看如下代码:
import socket
import re
from threading import Thread
def server_client(new_socket):
#接收浏览器的请求,即http请求
request = new_socket.recv(1024).decode("utf-8")
#打印client请求数据
print(request)
#将请求数据分片
client_requests = request.splitlines()
file_name = ""
#正则提取请求网页
ret = re.match(r"[^/]+(/[^ ]*)", client_requests[0])
#判断是否存在请求数据
if ret:
file_name = ret.group(1)
#调试信息
print("#"*50,file_name)
if file_name == "/":
file_name = "/index.html"
#处理请求数据是否存在
try:
f = open("."+ file_name, "rb")
except:
#没有请求资源返回404
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "------------file not found------------------"
new_socket.send(response.encode("utf-8"))
else:
#有数据返回状态200,并且以长连接返回请求数据
html_content = f.read()
f.close()
response_body = html_content
# 准备发送给浏览器数据---header
response_header = "HTTP/1.1 200 OK\r\n"
#告诉服务器发送长度
response_header += "Content-Length:%d\r\n" % len(response_body)
response_header += "\r\n"
# 准备发送给浏览器数据---body
response = response_header.encode("utf-8") + response_body
new_socket.send(response)
# noinspection PyUnreachableCode
def main():
#创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定
tcp_server_socket.bind(("", 8080))
#监听套接字
tcp_server_socket.listen(128)
while True:
new_socket, client_add = tcp_server_socket.accept( )
#创建客户端线程池
p = Thread(target=server_client,args=(new_socket,))
#开始客户端线程
p.start()
tcp_server_socket.close()
if __name__ == "__main__":
main()
实现效果:
本次主要学习http原理以及三次握手和四次挥手,理解在web服务器中的应用,当然解决办法还很多这里只是说明了其中一种方式。