2017-09-15 7 views
0

私はTwistedにはかなり新しいので、これはルーキーの間違いだと確信しています。私はクライアントからメッセージを受け取るシンプルなサーバーを構築しました。メッセージを受信すると、サーバーはコンソールにメッセージを出力するコールバックを起動します。工場出荷時に新しい延期が作成されていません

最初の例では、サーバーは期待どおりに動作します。残念なことに、2番目のクライアントを起動すると、「twisted.internet.defer.AlreadyCalledError」というエラーが表示されます。工場が延期の新しいインスタンスを作るということは私の理解であった。すなわち、新しい延期は以前に呼ばれていなかっただろうか?

下記のコードをご覧ください。どんな助けでも大歓迎です。

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

一つだけLockServerFactoryがあなたのプログラムであっ作成されていることに注意してください:接続が受け入れられるよう

factory = LockServerFactory() 

しかし、多くのLockProtocolインスタンスが作成されます。接続ごとの状態がある場合、それを置く場所はLockProtocolです。

「ロックデータが完了しました」というイベントは1回限りではないようですので、Deferredはおそらくこのジョブの適切な抽象化ではありません。

class LockServerFactory(ServerFactory): 

    protocol = LockProtocol 

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

factory = LockServerFactory(got_lockData) 

(ちなみに、私はからclientConnectionFailedを落としたことに気づく:代わりに火災そのイベントが発生し、おそらくあなたは多目的イベントハンドラ、おそらく特注をしたいがDeferredLockServerFactory

この実装は、ClientFactoryのメソッドです。サーバーファクトリでは決して呼び出されません)

関連する問題