我有一个使用 Twisted 用 python 编写的服务器应用程序,我想知道如何终止我的协议(bottalk)的实例。每次我获得新的客户端连接时,我都会在内存中看到该实例(print 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()
您通过调用关闭了 TCP 连接loseConnection
。但是您的应用程序中没有任何代码可以从clients
工厂清单。
尝试将其添加到您的协议中:
def connectionLost(self, reason):
Factory.clients.remove(self)
这将从中删除协议实例clients
协议连接丢失时的列表。
另外,您应该考虑不使用全局Factory.clients
来实现这个功能。由于全局变量不好的所有常见原因,它很糟糕。相反,为每个协议实例提供一个引用its工厂并使用:
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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)