뒤틀린 상태에서 어떻게 '연결 관리'를 특정 연기를 발사 할 수 있습니까?
-
05-09-2019 - |
문제
이것은 더 큰 프로그램의 일부입니다. 관련 부분 만 설명하겠습니다. 기본적으로 내 코드는 원격 호스트에 대한 새로운 연결을 생성하려고합니다. 연결이 설정되면 연기 된 연기를 반환해야하므로 무언가를 보낼 수 있습니다.
나는 연결을 만들고있다 twisted.internet.interfaces.IReactorSSL.connectSSL
. 그 전화 buildProtocol
내 ClientFactory
새로운 연결을 얻는 인스턴스 (twisted.internet.protocol.Protocol
) 개체 및 반환 a twisted.internet.interfaces.IConnector
. 연결이 시작되면 트위스트 호출 startedConnecting
공장에서 IConnector
. 실제로 연결이 이루어지면 프로토콜의 connectionMade
콜백은 논쟁없이 호출됩니다.
이제 호스트/포트 당 하나의 연결 만 필요하면 나머지는 쉽습니다. 전화하기 전에 connectSSL
, 나는 연기를 만들어서 (호스트, 포트)에 키가 든 사전에 넣었습니다. 그런 다음 프로토콜 연결에서 사용할 수 있습니다. self.transport.getPeer()
호스트/포트를 검색하려면이를 사용하여 연기를 찾아 콜백을 발사하십시오. 그러나 둘 이상의 연결을 만들고 싶다면 이것은 분명히 분명합니다.
문제는 전화하기 전에 내가 만든 연기를 연관시키는 다른 방법을 볼 수 없다는 것입니다. connectSSL
이랑 connectionMade
나중에.
해결책
이것을 더 살펴보면, 나는 더 나은 방법이 있기를 바랍니다. 이것은 이상해 보입니다.
Twisted에는 수업이 있습니다. ClientCreator
간단한 단일 사용 연결을 생성하는 데 사용됩니다. 이론적으로는 내가 원하는 것을 수행합니다. 연결하고 반환합니다 Deferred
연결이 설정되면 발생합니다. 그래도 프로토콜 생성자에게 인수를 전달할 수있는 능력을 잃고 연결간에 상태를 공유 할 방법이 없기 때문에 이것을 사용할 수 있다고 생각하지 않았습니다.
그러나 나는 단지 그것을 깨달았다 ClientFactory
생성자가 수락합니다 *args
프로토콜 생성자로 전달합니다. 또는 적어도 그것은처럼 보입니다. 이것에 대한 문서는 사실상 없습니다. 이 경우 공장에 대한 참조 (또는 공장이 더 이상 필요하지 않은 경우)를 참조 할 수 있습니다. 그리고 나는 다시 돌아온다 Deferred
연결이 설정되면 발생합니다.