4

我有一个扭曲的 ReconnectingClientFactory,我可以通过这个工厂成功连接到给定的 ip 和端口对。而且效果很好。

reactor.connectTCP(IP、端口、myHandsomeReconnectingClientFactory)

在这种情况下,当服务器消失时,myHandsomeReconnectingClientFactory 会尝试连接相同的 ip 和端口(如预期的那样)。

我的目标是,当服务于给定 ip 和端口对的服务器消失时,连接到备份服务器(具有不同的 ip 和端口)。

任何关于如何实现这一目标的想法/评论将不胜感激。

4

2 回答 2

3

我尝试类似:

class myHandsomeReconnectingClientFactory(protocol.ReconnectingClientFactory):

    def __init_(self, hosts):
        # hosts should be a list of tuples (host, port)
        self._hosts = hosts

    def clientConnectionFailed(self, connector, reason):
        if self.continueTrying:
            self._try_next_host(connector)

    def clientConnectionLost(self, connector, unused_reason):
        if self.continueTrying:
            self._try_next_host(connector)

    def _try_next_host(self, connector):
        # round robing of servers
        to_try = self._hosts.pop(0)
        self._hosts.append(to_try)
        connector.host, connector.port = to_try
        self.connector = connector
        self.retry()

我还没有实际测试过它,但至少它应该给你一个很好的起点。好运。

于 2013-01-11T13:39:06.743 回答
2

ReconnectingClientFactory没有这个能力。您可以构建自己的工厂来实现这种重新连接逻辑,主要是通过挂钩到clientConnectionFailed工厂方法。当它被调用并且你认为有理由切换服务器的原因(例如,twisted.internet.error.ConnectionRefused)时,选择列表中的下一个地址并使用适当的reactor.connectXYZ方法尝试连接到它。

您也可以尝试将其构建为端点(这是某些人首选的较新的高级连接设置 API),但处理与端点的重新连接还不是一个有据可查的主题。

于 2013-01-10T19:55:41.597 回答