Проблема с TCP сервером в Twisted - PullRequest
1 голос
/ 09 июня 2010

Я пытаюсь создать простой 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". отправить сообщение к целевому соединению. Но оно не работает. Сообщение отображается только в том же соединении. Надеюсь, кто-то может показать мне некоторые указания по этому поводу.

Спасибо!

1 Ответ

3 голосов
/ 09 июня 2010

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

...