如何在 Twisted 框架中将连接成功或失败传递给调用者?

How to pass connection success or failure to the caller in the Twisted framework?

完成一些基本的 tutorials 后,我希望我的 TCP/UDP 客户端退出,并显示一个指示它是否已连接的代码。在 Twisted 中 return 退出代码的正确方法是:

point = TCP4ClientEndpoint(reactor, "localhost", 1234)
d = connectProtocol(point, ClientProtocol())
reactor.run()
sys.exit(0)

然后,当进程终止时,它将以代码 0 退出,以指示正常终止。如果客户端超时而不是成功连接,它应该如何将值传递回然后可以传递给 sys.exit 而不是常量 0?

通过关注 Deferred 的结果来确定 TCP 连接是成功还是失败:

d = connectProtocol(point, ClientProtocol())
d.addCallbacks(
    connected,
    did_not_connect,
)

通过 connecteddid_not_connect 的适当实施,您应该能够将合适的值传递给后续 sys.exit 调用。

例如,

class Main(object):
    result = 1

    def connected(self, passthrough):
        self.result = 0
        return passthrough

    def did_not_connect(self, passthrough):
        self.result = 2
        return passthrough

    def exit(self):
        sys.exit(self.result)

main = Main()
d = connectProtocol(point, ClientProtocol())
d.addCallbacks(
    main.connected,
    main.did_not_connect,
)
reactor.run()
main.exit()