С Twisted, как 'connectionMade' может запустить определенное Отложенное?

StackOverflow https://stackoverflow.com/questions/570397

Вопрос

Это часть более масштабной программы;Я объясню только соответствующие части.По сути, мой код хочет создать новое соединение с удаленным хостом.Это должно вернуть отложенное сообщение, которое срабатывает после установления соединения, чтобы я мог что-то отправить по нему.

Я создаю связь с twisted.internet.interfaces.IReactorSSL.connectSSL.Это призывает buildProtocol на моем ClientFactory экземпляр для получения нового соединения (twisted.internet.protocol.Protocol) объект, и возвращает twisted.internet.interfaces.IConnector.Когда соединение запущено, Twisted вызывает startedConnecting на заводе, придавая ему IConnector.Когда соединение действительно установлено, протокол connectionMade вызывается обратный вызов без аргументов.

Теперь, если бы мне нужно было только одно соединение для каждого хоста / порта, остальное было бы легко.Перед вызовом connectSSL, Я бы создал отложенный и поместил его в словарь с ключом (хост, порт).Затем, в протоколе connectionMade, я мог бы использовать self.transport.getPeer() чтобы получить хост / порт, используйте его для поиска отложенного и запуска его обратных вызовов.Но это, очевидно, не работает, если я хочу создать более одного соединения.

Проблема в том, что я не вижу никакого другого способа связать отложенный файл, который я создал перед вызовом connectSSL с помощью connectionMade позже.

Это было полезно?

Решение

Посмотрев на это еще немного, я думаю, что нашел решение, хотя, надеюсь, есть способ получше;это кажется немного странным.

У Twisted есть класс, ClientCreator это используется для создания простых одноразовых соединений.Теоретически это делает то, что я хочу;подключает и возвращает Deferred это срабатывает при установлении соединения.Однако я не думал, что смогу это использовать, поскольку я потерял бы возможность передавать аргументы конструктору протокола и, следовательно, не имел бы возможности делиться состоянием между соединениями.

Однако я только что понял, что ClientFactory конструктор действительно принимает *args чтобы перейти к конструктору протокола.Или, по крайней мере, это выглядит так;документации по этому поводу практически нет.В этом случае я могу дать ему ссылку на мою фабрику (или что-то еще, если фабрика больше не нужна).И я получаю обратно Deferred это срабатывает при установлении соединения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top