У меня есть витая фабрика, которая создает протокол из LineReceiver, прослушивая сокет TCP.
Я хочу ограничить количество клиентских подключений к LineReceiver до 1 и иметь дополнительные клиентские запросы «отклоненные».
Я видел некоторые другие подсказки, относящиеся к тому, как заставить клиентов ждать ( Как ограничить количество одновременных подключений в Twisted ), но я хотел бы чисто отказаться от любых дополнительных подключений.
Мой код является упрощением, взятым из предыдущего URL, по ограничению одновременных подключений.
Нужно ли отказываться от соединений на заводе-изготовителе или создавать протокол, а затем сразу же закрывать соединение?
РЕДАКТИРОВАТЬ: Ага. Я думаю, что я решил это, в том, что когда соединения получены в протоколе, если buildCount> 1, то self.transport.abortConnection (), кажется, работает
Любые предложения / комментарии о том, является ли это правильным способом сделать это? Возможно, было бы лучше, если бы «отказано в соединении», а не сервер принял это соединение и сразу же закрыл его.
class myProtocol(LineReceiver):
def __init__(self, factory):
self.factory = factory
def connectionMade(self):
if self.factory.buildCount > 1:
self.transport.abortConnection()
else:
self.sendLine("connection accepted".encode())
def connectionLost(self):
# decrement count of connected clients
self.factory.buildCount -= 1
def lineReceived(self, line):
self.sendLine("echo '{0}'".format(line.decode()).encode())
class myFactory(Factory):
def __init__(self, mode, logger):
"""
Factory only runs once
"""
self.buildCount = 0
def buildProtocol(self, addr):
"""
Factory runs buildProtocol for each connection
"""
self.buildCount += 1
return myProtocol(self)
reactor.listenTCP(9000, myFactory())
reactor.run()