多线程Web服务器搭建
import socket
import threading
def son(get_sock):
# 接收数据 数据一定要接收
ret = get_sock.recv(4096)
# 完善:判断用户是否离开
if len(ret) == 0:
print('用户下线')
get_sock.close()
return
# 解析请求报文,得到请求资源中的资源路径
ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
# 判断当/时候返回主页面
if ret_road == '/':
ret_road = '/index.html'
try:
# 响应报文和发送
# 读取网页资源 rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
file = open('./static' + ret_road, 'rb')
body_data = file.read()
file.close()
# with open写法
# with open('./static/index.html','rb')as file:
# body_data = file.read()
except Exception as e:
with open('./static/404.html', 'rb') as file:
body_data = file.read()
resp_data = 'HTTP/1.1 404 Not Found\r\nServer:HANYAN/1.1\r\n\r\n'
else:
resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
finally:
# 发送数据
get_sock.send(resp_data.encode(encoding='gbk') + body_data)
# 关闭
get_sock.close()
def main():
web_sock = socket.socket()
web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
web_sock.bind(('',9999))
web_sock.listen(128)
while True:
#接收一个新的连接请求
get_sock, get_adress = web_sock.accept()
# print('用户%s 进入' % str(get_adress))
thd = threading.Thread(target=son, args=(get_sock,))
#设置守护主线程
thd.setDaemon(True)
thd.start()
if __name__ == '__main__':
main()
面向对象版Web服务器搭建
import socket
import threading
class Frame(object):
def __init__(self):
web_sock = socket.socket()
web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
web_sock.bind(('', 9999))
web_sock.listen(128)
self.web_sock = web_sock
def start(self):
while True:
# 接收一个新的连接请求
get_sock, get_adress = self.web_sock.accept()
print('用户%s 进入' % str(get_adress))
thd = threading.Thread(target=self.son, args=(get_sock,))
# 设置守护主线程
thd.setDaemon(True)
thd.start()
@staticmethod
def son(get_sock):
# 接收数据 数据一定要接收
ret = get_sock.recv(4096)
# 完善:判断用户是否离开
if len(ret) == 0:
print('用户下线')
get_sock.close()
return
# 解析请求报文,得到请求资源中的资源路径
ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
# 判断当/时候返回主页面
if ret_road == '/':
ret_road = '/index.html'
try:
# 响应报文和发送
# 读取网页资源 rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
file = open('./static' + ret_road, 'rb')
body_data = file.read()
file.close()
# with open写法
# with open('./static/index.html','rb')as file:
# body_data = file.read()
except Exception as e:
with open('./static/404.html', 'rb') as file:
body_data = file.read()
resp_data = 'HTTP/1.1 404 Not Found\r\nServer:HANYAN/1.1\r\n\r\n'
else:
resp_data = 'HTTP/1.1 200 OK\r\nServer:HANYAN/1.1\r\n\r\n'
finally:
# 发送数据
get_sock.send(resp_data.encode(encoding='gbk') + body_data)
# 关闭
get_sock.close()
def main():
option = Frame()
option.start()
if __name__ == '__main__':
main()
承接上一篇Web服务器搭建,可以参考上篇对照就容易理解了。
https://blog.csdn.net/a1014825552/article/details/97293575