Как выключить и запустить сервер в Python Twisted? - PullRequest
0 голосов
/ 08 декабря 2011

Мой клиент (на основе витой) должен автоматически переподключаться к серверу, когда соединение потеряно, мне нужно протестировать эту функцию, вот мой метод тестирования, где в комментарии @todo очень четко указано, какое поведение ожидается:

@defer.inlineCallbacks
def test_reconnect_on_connection_loss(self):
    client = SMPPClientFactory(self.config)
    client.reConnect = mock.Mock(wraps=client.reConnect)
    # Connect
    smpp = yield client.connect()

    # Bind
    yield smpp.bindAsTransmitter()

    # @todo: A connection loss is expected here
    #        the client is supposed to try reconnections
    #        for a while, the server then shall start
    #        again and the client will get connected.

    # Unbind & Disconnect
    yield smpp.unbindAndDisconnect()

    ##############
    # Assertions :
    # Protocol verification
    self.assertNotEqual(0, client.reConnect.call_count)

На стороне сервера я пытаюсь прервать соединение сразу после получения запроса bindAsTransmitter:

class LooseConnectionOnBindSMSC(SMSC):

    def handleBindAsTransmitter(self, reqPDU):
        self.sendSuccessResponse(reqPDU)

        # Connection is aborted here:
        self.transport.abortConnection()

Соединение успешно прервано, мой клиент пытается восстановить соединение, как и ожидалось, но ему так и не удалось снова запустить мой сервер.

1 Ответ

1 голос
/ 08 декабря 2011

Ваш сервер все еще работает (насколько кто-либо может судить по коду в вашем вопросе).Закрытие одного подключения к клиенту не мешает серверу принимать новые подключения.

Способ остановить прослушивающий порт от прослушивания - с помощью port.stopListening() (обратите внимание, что он возвращает Deferred).Вы можете снова начать прослушивание порта с помощью другого reactor.listenTCP (или любого API, который вы использовали для начала прослушивания в первый раз).

...