3

我有一个使用twisted用python编写的服务器应用程序,我想知道如何杀死我的协议实例(bottalk)。每次我获得一个新的客户端连接时,我都会在内存中看到该实例(打印 Factory.clients).. 但是假设我想从服务器端杀死其中一个实例(删除特定的客户端连接)?这可能吗?我尝试使用 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 连接loseConnection。但是您的应用程序中没有任何代码可以从clients工厂列表中删除项目。

尝试将此添加到您的协议中:

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.clients而不是Factory.clients.

于 2012-11-05T22:01:24.193 回答