Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2015 18:52:38

hound
Зарегистрирован: 2014-10-27
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

TCP-Client + redis (twisted)

Добрый день, пишу скрипт, который слушал бы канал redis и выдавал приходящие сообщения на сервер. Вот, что получилось:

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?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version