Как ограничить 1 соединение для витой фабрики tcpserver - PullRequest
0 голосов
/ 29 августа 2018

У меня есть витая фабрика, которая создает протокол из 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()
...