Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: YoungОтветов: 1

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

Спасибо!

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

pythontcptwisted

Ответы

Ответ 1 · рейтинг 3 · Rakis

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы