【发布时间】:2011-03-05 16:33:53
【问题描述】:
我正在寻找一些关于如何解决我认为 Twisted 非常适合的问题的一般信息。 (我是 Twisted 新手,但不是 Python)
我有一个家庭自动化控制器,它可以支持单个 TCP 套接字连接,发送和接收二进制数据。我想使用 XMPP 作为到套接字的桥梁,以便用户可以发送命令和接收事件。
我得到了一个与 Twisted 一起使用的基本套接字连接,它能够发送和接收来自 O'Reilly 书中的示例之一的命令。我也有一个使用 SleekXMPP 库编写的完全正常工作的 Python XMPP 机器人,我对此很满意。我只是不确定如何将它们组合在一起。
基本场景是:
- 用户向 XMPP bot 发送消息,它会确定向套接字发送什么命令
- ASCII Socket 命令转换为二进制发送到套接字
- Socket 接收命令并发送二进制响应
- 二进制响应转换为 ASCII
- XMPP 机器人将响应发送回用户。
- 网络事件(独立于用户操作)也可以通过网络套接字接收并发送给用户
#6 提出了挑战,否则我会在需要写东西时按需打开/关闭套接字。
让我难以理解 Twisted 的部分是使这两个事件循环通信的最佳方法。我看过很多关于使用队列、延迟、线程、选择等的信息。我觉得如果我学会正确使用该工具,Twisted 可以处理大部分复杂性。
如果有人能指出我正确的方向,我会接球并带着它跑。正如我所提到的,我对我的 XMPP 机器人很满意,我想使用现有的代码。我认为我的问题现在归结为在后台创建套接字,然后在前台从该套接字发送和接收数据。
顺便说一句,我很高兴在我的代码运行后分享回来,以便其他人可以从我寻求的帮助中受益。
-- 斯科特
【问题讨论】:
-
我不确定您要做什么。什么是“背景和前景”?您是否在考虑线程,因为 twisted 不使用该概念。据我了解,消息类似于
user -> bot -> proxy -> backend -> proxy -> bot -> user,您想编写代理,在 xmpp 和一些二进制协议之间进行转换? -
我想将管理网络套接字的 Twisted 事件循环(反应器?)与运行我的 XMPP 机器人的 SleekXMPP 事件循环结合起来。我需要在这两者之间进行通信——当网络事件发生时,我需要通过 XMPP 将它们传递给用户,当用户通过 XMPP 发送命令时,我需要能够将这些消息转换为发送到我的套接字的消息。一些信息表明我倾向于使用 Queue 对象作为线程之间通信的一种方式,但如果 Twisted 不使用线程,我不确定如何继续前进。