Проблема с TCP-сервером в Twisted

Я пытаюсь создать простой TCP-сервер с использованием Twisted, который может взаимодействовать между разными клиентскими соединениями. Основной код выглядит следующим образом:

#!/usr/bin/env python
from twisted.internet import protocol, reactor
from time import ctime

#global variables
PORT = 22334
connlist = {}    #store all the connections
ids = {}    #map the from-to relationships

class TSServerProtocol(protocol.Protocol):

    def dataReceived(self, data):
        from_id,to_id = data.split('|') #get the IDs from standard client input,which looks like "from_id|to_id"

        if self.haveConn(from_id):    #try to store new connections' informations
            pass
        else:
            self.setConn(from_id)
            self.setIds(from_id,to_id) 

        if to_id in self.csids.keys():                 
             self.connlist[to_id].transport.write(\
             "you get a message now!from %s \n" % from_id)    #if the to_id target found,push him a message.doesn't work as expected
    def setConn(self,sid):
        connlist[sid] = self

    #some other functions

factory = protocol.Factory()
factory.protocol = TSServerProtocol
print 'waiting from connetction...'
reactor.listenTCP(PORT, factory)
reactor.run()

Как упоминалось в комментариях, если приходит новое клиентское соединение, я сохраню его дескриптор соединения в глобальной переменной connlist, которая похожа на

connlist = {a_from_id:a_conObj,b_from_id:b_conObj,....}

а также проанализируйте ввод, затем сопоставьте его информацию от-до в ids. Затем я проверяю, соответствует ли ключ в ids текущему "to_id". Если это так, получаю дескриптор соединения с помощью connlist[to_id] и отправляю сообщение на целевое соединение. Но это не работает. сообщение отображается только при том же соединении.

Спасибо!


person Young    schedule 09.06.2010    source источник
comment
Ваша dataReceived функция ссылается на локальный self.connlist, а не на глобальный. Не используйте глобальные переменные. Вы можете сохранить список подключений в экземпляре фабрики и получить к нему доступ из экземпляра протокола через self.factory.connlist   -  person MattH    schedule 09.06.2010
comment
@ MattH, спасибо за замечание. Не могли бы вы сказать мне, какой объект мне следует хранить в connlist, если я сделаю это на заводе?   -  person Young    schedule 09.06.2010
comment
Было бы здорово, если бы вы могли придумать лучшее название для этого вопроса, что-то, что более конкретно указывает на то, что вы пытаетесь задать. У других людей тоже есть похожие вопросы, и это поможет им найти их при поиске. Слишком много вопросов SO Twisted озаглавлены просто проблема с Twisted или Twisted сломана, нужна помощь или помощь с Twisted и так далее.   -  person Glyph    schedule 10.06.2010
comment
@ Glyph, ну, хороший совет. На самом деле, когда мне трудно дать краткое описание проблемы, я использую такие заголовки, как этот ... Наверное, мне следует улучшить свой недоваренный английский.   -  person Young    schedule 10.06.2010


Ответы (1)


Каждый раз, когда устанавливается TCP-соединение, Twisted создает уникальный экземпляр TSServerProtocol для обработки этого соединения. Таким образом, вы увидите только 1 соединение в TSServerProtocol. Обычно это то, что вы хотите, но фабрики можно расширить для отслеживания соединений, которые вы здесь пытаетесь сделать. В частности, вы можете создать подкласс Factory и переопределить метод buildProtocol () для отслеживания экземпляров TSServerProtocol. Взаимосвязь между всеми классами в Twisted требует немного времени, чтобы изучить и привыкнуть. В частности, лучше всего подойдет эта часть стандартной документации Twisted. друг на ближайшее время ;-)

person Rakis    schedule 09.06.2010
comment
Спасибо за хорошее предложение. Я пытаюсь справиться с этим лучше :) - person Young; 09.06.2010