这一段内容是我失败了好几次总结分析出来的代码,可以保证信息全部接收,自动判断用户是否断开连接并关闭其套接字。

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 条评论

发表回复

头像占位符