2017-12-01 25 views
1

Twisted를 사용하여 프록시 서버를 작성하고 서버 연결이 닫혔는지 확인하는 데 문제가 있습니다.Twisted로 연결이 닫혔는지 확인

는 지금, 나는이

클라이언트 < -> 프록시 < -> 서버 텔넷과

테스트는, 프록시가 성공적으로 클라이언트에서 서버로 메시지를 전달하고 다시 서버 응답을 전달 클라이언트에게. 그러나 내 문제는 클라이언트가 프록시와 서버 간의 연결을 닫는 명령을 실행하면 클라이언트와 프록시 간의 연결이 여전히 남아있는 것입니다. 여기

이다

reactor.connectTCP('localhost', 1234, client_factory) 

내가 dataReceived에 아마도 연결의 상태를 모니터링하고 서버가 닫을 경우에서 볼 수 있도록 할 줄에 내 코드

client_factory = protocol.ClientFactory() 
    client_factory.protocol = ClientTelnetProtocol 
    client_factory.proxy = self 

    try: 
     clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     clientsocket.connect(('localhost', 1234)) 
     clientsocket.close() 
     reactor.connectTCP('localhost', 1234, client_factory) 
    except Exception as err: 
     print(err) 
     self.transport.loseConnection() 

의 일부() 또는 가능한 경우 서버가 프록시에 대한 연결을 닫을 때 인터럽트를 설정하고 프록시가 클라이언트에 대한 연결을 즉시 닫도록하십시오.

답변

1

ITransportIProtocol 공급자에서 connectionLost을 호출하여 연결이 끊어진 이벤트를 IProtocol에 알립니다. 따라서 해당 이벤트에 대응하려면 해당 프로토콜에 connectionLost을 구현해야합니다 (이 경우 ClientTelnetProtocol,이 경우 나타 납니까?). 그러면 해당 방법에 응용 프로그램 논리를 적용하십시오. 이 방법은 ITransport 구현이 연결이 끊어져서 사용자의 요구를 충족시켜야 할 때 호출됩니다 (Twisted는 (대부분) 단일 스레드 협업 멀티 태스킹 시스템이기 때문에 인터럽트이 아니므로 if (예 : clientsocket.connect) 트위스트 된 응용 프로그램 코드는 완료되고 반응기가 제어권을 회복 할 때까지 콜백을 호출하지 않습니다.하지만 기회가 주어 지 자마자 이벤트 (예 : 연결 (예 : connectionLost)

예제 코드에서 socket 모듈을 직접 사용하여 대상 주소에 대한 연결을 직접 삭제 한 이유를 알 수 없습니다. 서버가 연결을 수락하는지 여부를 결정하려고 시도합니다. 이 경우 socket 모듈을 사용하고 예외를 확인하는 대신 reactor.connectTCP에 의해 시도 된 연결이 실패했음을 감지하려면 the ClientFactory method clientConnectionFailed을 사용할 수 있습니다. Twisted's endpoint abstraction을 사용하여이 알림을 Deferred 콜백 대신받을 수도 있습니다.

데이터 흐름보다 높은 수준의 추상화를 제공하는 Tubes도 관심을 가질 수 있습니다.

+0

고마워, 정확히 무엇을하려고했는데 clientConnectionFailed 메서드를 찾을 수 없으므로 대신에 나는 값싼 작업을 사용하여 소켓을 설정하고 먼저 연결을 시도했다. 실패 할 경우 연결을 중단하십시오. –