Twisted 客户端无法在 Windows 上以不同的方式连接到 Linux/MacOS
Posted
技术标签:
【中文标题】Twisted 客户端无法在 Windows 上以不同的方式连接到 Linux/MacOS【英文标题】:Twisted client failed to connect working differently on Windows to Linux/MacOS 【发布时间】:2017-03-08 12:26:27 【问题描述】:我在使用 Twisted 端点 connect() 函数时尝试检测失败的连接。奇怪的是,以下在 Windows 下工作并给出了预期的结果,但在 Linux/Mac OS 系统上,我从未看到来自 errBack 的打印语句。是我的代码不正确还是 Windows Twisted 的工作方式与其他代码不同?
class Gateway():
def __init__(self):
from twisted.internet.endpoints import TCP4ClientEndpoint
endpoint = TCP4ClientEndpoint(reactor, 'localhost', 8000)
authInterfaceFactory = AuthInterfaceFactory(self.__authMsgProcessor)
d = endpoint.connect(authInterfaceFactory)
d.addErrback(self.ConnFailed)
print("WAITING...")
def ConnFailed(self, msg):
print("[DEBUG] Errback : 0".format(msg))
Windows 结果
WAITING... [DEBUG] Errback : [Failure instance: Traceback (failure 没有框架)::连接是 被对方拒绝:10061:无法建立连接,因为 目标机器主动拒绝..]
我创建了一个使用端点连接的客户端并立即返回,尽管在与我的代码相同的设置中使用它时它不会:
self.__networkThread = threading.Thread(target=reactor.run,
kwargs="installSignalHandlers": False)
self.__networkThread.start()
from twisted.internet.endpoints import TCP4ClientEndpoint
endpoint = TCP4ClientEndpoint(reactor, 'localhost', 8000)
d = endpoint.connect(authInterfaceFactory)
d.addErrback(self.ConnFailed)
d.addCallback(self.ConnOK)
在线程中运行反应器时逻辑是否不正确(我必须按照我的意愿从头开始)?
【问题讨论】:
【参考方案1】:您不能在一个线程中运行反应器并在另一个线程中使用 Twisted API。除了专门用于与线程交互的几个 API 之外,您必须使用单个线程中的所有 Twisted API。
“我希望它从头开始”听起来不像是使用线程的理由。许多使用 Twisted 的程序在没有线程的情况下“从头开始”启动反应器。
(也请将此作为需要完整示例的绝佳示例。)
【讨论】:
我不确定你的意思。 我添加了一个成功的回调,在 Linux/Mac 上它仍然存在并且什么都不做。我使用 telnet 到 8000 端口并立即出错 $ telnet localhost 8000 正在尝试 ::1... telnet: 连接到地址 ::1: 连接被拒绝 正在尝试 fe80::1... telnet: 连接到地址 fe80::1: 连接被拒绝正在尝试 127.0.0.1... telnet:连接到地址 127.0.0.1:连接被拒绝 telnet:无法连接到远程主机 可能是时候让 tcpdump 和/或 dtrace 参与进来了。以上是关于Twisted 客户端无法在 Windows 上以不同的方式连接到 Linux/MacOS的主要内容,如果未能解决你的问题,请参考以下文章
在Windows 10上安装Twisted时出错,Python 3.8.0
Python-Twisted:反向代理到 HTTPS API:无法连接