import socket import threading import logging log=logging.basicConfig(level=logging.DEBUG, format='%(asctime)s--%(threadName)s--%(processName)s--' '%(message)s--%(levelname)s--%(name)s') logging.getLogger(__name__) #每次到了accept和recv会阻塞 class WeChat(): def __init__(self): self.tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) self.tcp_server.bind(('127.0.0.1',9966)) self.content={} def run(self): self.tcp_server.listen() logging.info('服务启动....') self.accept() def accept(self): while True: logging.info('服务器等待接受链接....') conn,addr=self.tcp_server.accept() #阻塞 self.content[addr]=conn logging.info('接受了来自{}的链接'.format(addr)) threading.Thread(target=self.recvmsg,args=(conn,addr)).start() #开启线程 def recvmsg(self,conn,addr): while True: logging.info('服务器等待接受来自{}的消息'.format(addr)) data=conn.recv(1024) if data: if data.decode('gbk').lower()=='quit': logging.info('{}退出了'.format(conn.getpeername())) self.content.pop(conn.getpeername()) conn.close() break logging.info('服务器接受来自{}的消息'.format(data.decode('gbk'))) #群发模式 msg="【群发】{}".format(conn.getpeername()).encode('gbk') msg+=data for v in self.content.values(): #得到每个连接的客户端的conn v.send(msg) # conn.send(data) else: logging.info('{}断开连接'.format(addr)) conn.close() break def close(self): for v in self.content.values(): v.close() self.tcp_server.close() logging.info('服务器关闭') server=WeChat() server.run()
python实现群聊服务器
最新推荐文章于 2023-01-07 09:39:58 发布