def follow(filename): url = 'ws://localhost:9292/follow/{}'.format(filename) ws = WebSocket() try: ws.connect(url) while True: msg = ws.recv() print('{} :: {}'.format(filename, msg), end='') finally: # ws.close() takes forever ws.shutdown()
class NetworkingThread(Thread): def __init__(self, parent, logger, callBack): super(NetworkingThread, self).__init__() self.room = parent.room self.parent = parent self.logger = logger self.cb = callBack self.daemon = True self.name = "{}-NetworkingThread".format(self.room.roomId) self.connection = WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE}) self.callBackThread = CallBackThread(self.room, self.logger) self.heartBeatThread = Thread(target=self.heartBeat, daemon=True, name=f"{self.room.roomId}-HeartBeat") self.binaryDataQueue = Queue(100) self.dataQueue = Queue(100) self.run_flag = True def connect(self, just_check=False): if just_check: if not self.connection.connected: self.logger.info("ws掉线, 正在重连") self.connection = WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE}) self.connection.connect(self.room.roomWsUrl) if self.connection.connected: self.logger.info("ws连接创建, 已连接") elif not self.connection.connected: self.connection.connect(self.room.roomWsUrl) if self.connection.connected: self.logger.info("ws连接创建, 已连接") self.run_flag = True self.start() def close(self): if self.is_alive() and self.run_flag: self.run_flag = False self.callBackThread.stop() self.join(10) self.connection.shutdown() self.logger.info("ws连接关闭") def send_byte(self, data): self.binaryDataQueue.put(data, False) def send_pack(self, pack): self.binaryDataQueue.put(pack.getData(), False) def send(self, data): self.dataQueue.put(data, False) def heartBeat(self, sec=25): per = sec * 2 self.logger.info("心跳循环开始") while self.run_flag: for i in range(0, per+1): if not self.run_flag: break sleep(0.5) self.logger.debug("心跳包已发送") self.send_pack(Pack({}, Operation.HEARTBEAT)) self.logger.info("心跳循环结束") return None def call_back_func(self): while self.run_flag: try: buff = self.connection.recv() self.cb(buff) break except Exception as exc: del exc self.connect(True) continue def stop(self): self.run_flag = False def run(self) -> None: self.logger.info("网络线程启动") self.heartBeatThread.start() self.callBackThread.start() while self.run_flag: self.connect(True) if len(self.dataQueue.queue) > 0: buff = self.dataQueue.get() self.logger.debug(buff) self.connection.send(buff, ABNF.OPCODE_TEXT) if len(self.binaryDataQueue.queue) > 0: buff = self.binaryDataQueue.get() self.logger.debug(buff) self.connection.send(buff, ABNF.OPCODE_BINARY) self.callBackThread.addTask(self.call_back_func) self.logger.info("网络线程已停止") return None