今天实现了一个简单版本的web服务器,不是很高大上,只是更能理解浏览器客户端与服务器的大致通信过程。
运用到了协程,初学者的朋友们有什么问题可以私信我哦。
import socket
import gevent
from gevent import monkey
import re
class WebServer(object):
monkey.patch_all()
def __init__(self):
self.tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.port = 8080
self.ip = "127.0.0.1"
self.tcp.bind((self.ip, self.port))
print("服务器绑定端口为:", self.port)
self.tcp.listen(128)
def __del__(self):
self.tcp.close()
def serviceClient(self, clientSocket):
# 接收客户端请求(客户端发送的数据)
request = clientSocket.recv(1024).decode('utf-8')
if len(request) == 0:
clientSocket.close()
return
# 以行为单位切割,并返回一个列表
requestLines = request.splitlines()
# print(requestLines)
requestFirstLine = requestLines[0]
fileName = re.match(r"[^/]+(/[^ ]*)", requestFirstLine).group(1)
if fileName == "/":
fileName = "/index.html"
print("请求的文件名是:", fileName)
try:
# 文件打开成功返回内容
with open('./html'+fileName, 'rb') as f:
content = f.read()
except Exception as ret:
# 文件打开失败返回的内容
responseHeader = "HTTP/1.1 404 NOT FOUND\r\n\r\n".encode("utf-8")
responseBody = "---------file not found------------".encode("utf-8")
else:
# 执行try成功后的代码
responseHeader = "HTTP/1.1 200 OK\r\n\r\n".encode("utf-8")
responseBody = content
clientSocket.send(responseHeader)
clientSocket.send(responseBody)
clientSocket.close()
def start_server(self):
# 三次挥手,四次握手
while True:
clientSocket, clientAddr = self.tcp.accept()
print(clientAddr, "连接服务器成功!")
# 调用服务函数
gevent.spawn(self.serviceClient, clientSocket)
def main():
a = WebServer()
a.start_server()
if __name__ == '__main__':
main()