#!usr/bin/env python# -*- coding:utf-8 _*-"""@author:zhengxin@file: test_socket3.py@time: 2023年2月1日 17:19# @describe: 练习二:使用makefile改写群聊类"""import datetimeimport socketimport threadingimport loggingFORMAT = "%(asctime)s %(threadName)s %(thread)d %(message)s"logging.basicConfig(format=FORMAT, level=logging.INFO)class ChatServer():def __init__(self, ip='0.0.0.0', port=9999):# def __init__(self, ip='127.0.0.1', port=9999):self.addr = (ip, port)self.sock = socket.socket()self.clients = {}self.event = threading.Event()def start(self):self.sock.bind(self.addr)# 服务启动self.sock.listen()# 启动线程threading.Thread(target=self.accept, name='accept').start()def accept(self):while not self.event.is_set():# 阻塞s, raddr = self.sock.accept()# makefilef = s.makefile(mode='rw')logging.info(s)logging.info(f)logging.info(raddr)self.clients[raddr] = f# 启动线程threading.Thread(target=self.recv, name='recv', args=(f, raddr)).start()def recv(self, f, addr): # 很多线程while not self.event.is_set():try:# 阻塞,bytes# data = sock.recv(1024)data = f.readline() # string, 换行符\nlogging.info(data)except Exception as e:logging.error(e)data = 'quit'if data == 'quit':self.clients.pop(addr)f.close()breakmsg = "ack{}. {} {}".format(addr,datetime.datetime.now().strftime("%Y/%m/%d-%H:%M:%s"),data)# 单个发送# sock.send('ack {}'.format(data.decode()).encode())# 多个发送for s in self.clients.values():# s.send(msg)f.write(msg)f.flush()def stop(self):""" 停止服务 """for s in self.clients.values():s.close()self.sock.close()self.event.set()def main():cs = ChatServer()cs.start()while True:cmd = input(">>>>>>")# 退出if cmd.strip() == 'quit':cs.stop()threading.Event.wait(3)breaklogging.info(threading.enumerate())if __name__ == '__main__':main()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。