from twisted.internet import protocol, reactor import time import threading import redis host = 'localhost' port = 9879 class ListenRedis(threading.Thread): def __init__(self): threading.Thread.__init__(self) print("Init redis") self.redis = redis.Redis() self.pubsub = self.redis.pubsub() self.pubsub.subscribe("test_sub") self.runing = True def run(self): for item in self.pubsub.listen(): self.work(item) def work(self, item): if item["type"] != "message": return print(item) factory.send_data(item["data"]) class Twist_client(protocol.Protocol): def dataReceived(self, data): print (data.decode()) if data.decode() == "OK": print("Server say say OK") class Twist_Factory(protocol.ClientFactory): protocol = Twist_client client = Twist_client() def clientConnectionFailed(self, connector, reason): print( '1connection failed:', reason.getErrorMessage()) time.sleep(2) connector.connect() def buildProtocol(self, addr): print ('Connected.') return Twist_client() def clientConnectionLost(self, connector, reason): print( '2connection lost:', reason.getErrorMessage()) time.sleep(2) connector.connect() def send_data(self, data): re.transport.write(data) print("Start") lis = ListenRedis() lis.start() factory = Twist_Factory() re = reactor.connectTCP(host, port, factory) reactor.run()
Более менее все работает, но есть некоторые особенности в работе с сервером:
при подключении к серверу мы должны дождаться от него ответа - сообщение “READY”
и после каждого отправленного сообщения должны дожидаться ответа “OK”
Подобный пример для работы с tcp клиентом взял из-за того, что тут есть событие потери связи с трекеров, но никак не могу разобраться с тем, чтобы после отправки сообщения на сервер ждать ответа.
Подскажите, как это можно реализовать и стоит ли вообще в таком случае использовать twisted?