【问题标题】:General approach for using Twisted in background to proxy TCP socket?在后台使用 Twisted 代理 TCP 套接字的一般方法?
【发布时间】:2011-03-05 16:33:53
【问题描述】:

我正在寻找一些关于如何解决我认为 Twisted 非常适合的问题的一般信息。 (我是 Twisted 新手,但不是 Python)

我有一个家庭自动化控制器,它可以支持单个 TCP 套接字连接,发送和接收二进制数据。我想使用 XMPP 作为到套接字的桥梁,以便用户可以发送命令和接收事件。

我得到了一个与 Twisted 一起使用的基本套接字连接,它能够发送和接收来自 O'Reilly 书中的示例之一的命令。我也有一个使用 SleekXMPP 库编写的完全正常工作的 Python XMPP 机器人,我对此很满意。我只是不确定如何将它们组合在一起。

基本场景是:

  1. 用户向 XMPP bot 发送消息,它会确定向套接字发送什么命令
  2. ASCII Socket 命令转换为二进制发送到套接字
  3. Socket 接收命令并发送二进制响应
  4. 二进制响应转换为 ASCII
  5. XMPP 机器人将响应发送回用户。
  6. 网络事件(独立于用户操作)也可以通过网络套接字接收并发送给用户

#6 提出了挑战,否则我会在需要写东西时按需打开/关闭套接字。

让我难以理解 Twisted 的部分是使这两个事件循环通信的最佳方法。我看过很多关于使用队列、延迟、线程、选择等的信息。我觉得如果我学会正确使用该工具,Twisted 可以处理大部分复杂性。

如果有人能指出我正确的方向,我会接球并带着它跑。正如我所提到的,我对我的 XMPP 机器人很满意,我想使用现有的代码。我认为我的问题现在归结为在后台创建套接字,然后在前台从该套接字发送和接收数据。

顺便说一句,我很高兴在我的代码运行后分享回来,以便其他人可以从我寻求的帮助中受益。

-- 斯科特

【问题讨论】:

  • 我不确定您要做什么。什么是“背景和前景”?您是否在考虑线程,因为 twisted 不使用该概念。据我了解,消息类似于user -> bot -> proxy -> backend -> proxy -> bot -> user,您想编写代理,在 xmpp 和一些二进制协议之间进行转换?
  • 我想将管理网络套接字的 Twisted 事件循环(反应器?)与运行我的 XMPP 机器人的 SleekXMPP 事件循环结合起来。我需要在这两者之间进行通信——当网络事件发生时,我需要通过 XMPP 将它们传递给用户,当用户通过 XMPP 发送命令时,我需要能够将这些消息转换为发送到我的套接字的消息。一些信息表明我倾向于使用 Queue 对象作为线程之间通信的一种方式,但如果 Twisted 不使用线程,我不确定如何继续前进。

标签: python twisted


【解决方案1】:

非阻塞 IO 引擎的问题之一是它几乎全有或全无。一旦引入阻塞代码,您很快就会失去事件驱动异步方法的大部分好处。只要有可能(根据经验),最好让整个应用在同一个反应器上运行。

在我看来,你有两个选择:

  1. Twisted 不是线程安全的。也就是说,您可以使用deferToThreadcallFromThread 等机制与其他线程进行交互。对于您的应用程序设计来说,这是迄今为止最令人困惑和不必要的复杂方法。如果你不熟悉扭曲,那会特别痛苦。
  2. 使用twisted.words.protocols.jabber,并使用twisted reactor 以非阻塞方式实现您的XMPP 内容。这样,它就会与所有其他扭曲的代码一起愉快地存在。并允许您在协议之间干净利落地交互。它将产生更少的代码,以及易于扩展、维护和测试的健壮实现。

【讨论】:

  • 谢谢,亚当。这正是我需要的信息。我会研究 Twisted 单词,然后将两者联系在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2012-05-11
相关资源
最近更新 更多