这一段内容是我失败了好几次总结分析出来的代码,可以保证信息全部接收,自动判断用户是否断开连接并关闭其套接字。
import socket
import threading
import time
from deves import log_output #此处为我自己写的日志输出模块,源码我放在了下面
time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
customer = {} #用户存储队列
message_save_list = {} #信息保存队列
#初始化socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
local_addr = ("",8001)
s.bind(local_addr)
s.listen(120)
s.setblocking(True)
def acceptusees():
while True:
socket_info,useraddr = s.accept()
customer[socket_info] = useraddr
log_output(message="用户" + useraddr[0] + ":" + str(useraddr[1]) + "进入",level="INFO")
def main():
t1 = threading.Thread(target=message_save)
t2 = threading.Thread(target=acceptusees)
t1.start()
t2.start()
def message_save():
while True:
try:
for i in list(customer.keys()):
time.sleep(0.1)
information = i.recv(1024).decode("utf-8")
if information == "":
leave = customer.pop(i)
i.close()
print("用户" + leave[0] + ":" + str(leave[1]) + "离开了...")
else:
message_save_list[i] = information
except RuntimeError:
pass
if __name__ == '__main__':
main()
log_output源代码
def log_output(message:str,level:str):
print("[" , time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) , "]" , "[" , level , "]:" , message)
0 条评论