2017-09-15 15 views
0

저는 Twisted에 새로 입문했습니다. 그래서 이것은 신참 실수라고 확신합니다. 나는 클라이언트로부터 메시지를받는 간단한 서버를 만들었고 서버는 메시지 수신시 콘솔에 메시지를 출력하는 콜백을 발생시킨다.새로운 지연을 생성하지 않는 팩토리 인스턴스

처음에는 서버가 예상대로 작동합니다. 불행히도, 두 번째 클라이언트를 시작할 때 나는 follow error "twisted.internet.defer.AlreadyCalledError"를 얻습니다. 공장에서 연기 된 새로운 인스턴스를 만들 것입니다. 즉, 이전에 새 지연이 호출되지 않았습니까?

아래 코드를 참조하십시오. 어떤 도움을 주시면 감사하겠습니다.

하나의 LockServerFactory 이제까지 당신의 프로그램에서 만든이 있음을
import sys 
from twisted.internet.protocol import ServerFactory, Protocol 
from twisted.internet import defer 

class LockProtocol(Protocol): 

    lockData = '' 

    def dataReceived(self, data): 
    self.lockData += data 

    if self.lockData.endswith('??'): 
     self.lockDataReceived(self.lockData) 

    def lockDataReceived(self, lockData): 
    self.factory.lockDataFinished(lockData) 

class LockServerFactory(ServerFactory): 

    protocol = LockProtocol 

    def __init__(self): 
    self.deferred = defer.Deferred() # Initialise deferred 

    def lockDataFinished(self, lockData): 
     self.deferred.callback(lockData) 

    def clientConnectionFailed(self, connector, reason): 
     self.deferred.errback(reason) 


def main(): 

    HOST = '127.0.0.1' # localhost 
    PORT = 10001 

    def got_lockData(lockData): 
    print "We have received lockData. It is as follows:", lockData 

    def lockData_failed(err): 
    print >> sys.stderr, 'The lockData download failed.' 
    errors.append(err) 


    factory = LockServerFactory() 

    from twisted.internet import reactor 

    # Listen for TCP connections on a port, and use our factory to make a protocol instance for each new connection 

    port = reactor.listenTCP(PORT,factory) 

    print 'Serving on %s' % port.getHost() 

    # Set up callbacks 

    factory.deferred.addCallbacks(got_lockData,lockData_failed) 

    reactor.run() # Start the reactor 

if __name__ == '__main__': 
    main() 

답변

0

주의 사항 :

연결이 허용됩니다로
factory = LockServerFactory() 

그러나, 많은 LockProtocol 인스턴스가 만들어집니다. 연결 당 상태 인 경우 넣을 위치는 LockProtocol입니다.

"잠금 데이터 완료"이벤트가 일회성이 아니므로 Deferred은 아마도이 작업에 적합한 추상화가 아닙니다. 덧붙여

class LockServerFactory(ServerFactory): 

    protocol = LockProtocol 

    def __init__(self, lockDataFinished): 
    self.lockDataFinished = lockDataFinished 

factory = LockServerFactory(got_lockData) 

(통지 내가로부터 clientConnectionFailed 하락했습니다 대신 해당 이벤트가 발생하면 발생시키는 DeferredLockServerFactory

는, 아마도 당신은 다목적 이벤트 핸들러, 아마도 사용자 정의 내장을 원하는 이 구현은 ClientFactory의 메서드입니다. 서버 팩토리에서는 절대로 호출되지 않습니다.