3

ツイストを使用して Python で記述されたサーバー アプリケーションがあり、プロトコル (ボットトーク) のインスタンスを強制終了する方法を知りたいです。新しいクライアント接続を取得するたびに、メモリ内にインスタンスが表示されます (print Factory.clients) .. しかし、サーバー側からこれらのインスタンスの 1 つを強制終了したいとしましょう (特定のクライアント接続をドロップします)。これは可能ですか?lineReceived を使用してフレーズを探してみました。一致する場合は、self.transport.loseConnection() を使用します。しかし、それはインスタンスまたは何かを参照していないようです..

class bottalk(LineReceiver):

    from os import linesep as delimiter

    def connectionMade(self):
            Factory.clients.append(self)
            print Factory.clients

    def lineReceived(self, line):
            for bots in Factory.clients[1:]:
                    bots.message(line)
            if line == "killme":
                    self.transport.loseConnection()

    def message(self, message):
            self.transport.write(message + '\n')

class botfactory(Factory):

    def buildProtocol(self, addr):
            return bottalk()

Factory.clients = []

stdio.StandardIO(bottalk())

reactor.listenTCP(8123, botfactory())

reactor.run()
4

1 に答える 1

5

を呼び出して TCP 接続を閉じましたloseConnectionclientsしかし、ファクトリのリストから項目を削除するコードはアプリケーションのどこにもありません。

これをプロトコルに追加してみてください:

def connectionLost(self, reason):
    Factory.clients.remove(self)

clientsこれにより、プロトコルの接続が失われたときに、リストからプロトコル インスタンスが削除されます。

Factory.clientsまた、この機能を実装するためにグローバルを使用しないことを検討する必要があります。グローバルが悪いという通常のすべての理由から、それは悪いことです。代わりに、各プロトコル インスタンスにそのファクトリへの参照を与え、それを使用します。

class botfactory(Factory):

    def buildProtocol(self, addr):
        protocol = bottalk()
        protocol.factory = self
        return protocol

factory = botfactory()
factory.clients = []

StandardIO(factory.buildProtocol(None))

reactor.listenTCP(8123, factory)

の代わりに各bottalkインスタンスを使用できるようになりました。self.factory.clientsFactory.clients

于 2012-11-05T22:01:24.193 に答える