GCM,我怎么知道 XMPP 数据包的结束?

Posted

技术标签:

【中文标题】GCM,我怎么知道 XMPP 数据包的结束?【英文标题】:GCM, how do I know end of XMPP packet? 【发布时间】:2015-02-27 21:48:43 【问题描述】:

我正在用 Python 实现一个 Google Cloud Messaging XMPP 服务器。我可以连接到 GCM 并对其进行身份验证,但是我使用 self.ssl_sock.recv(1024) 这不是很好,但适用于身份验证。

但是,当我以后想从 GCM 接收消息时,我在套接字上读取,但是我读取了多少字节?我在 xmpp 文档中找不到任何关于某种标头的信息,这些标头告诉数据包/数据的长度。

def read_from_socket(self):
        data = self.ssl_sock.recv(??)
        self.handle_message(data)

【问题讨论】:

【参考方案1】:

XMPP 不使用框架,因此没有标题。您需要使用流式(例如 SAX)XML 解析器(例如 expat)来解析 XML 流。可以通过跟踪解析器树的深度来确定“数据包”的 XMPP 等价物。

但是,如果您是 XMPP 新手,我强烈建议您使用库,而不是尝试自己从头开始正确编写所有这些内容。

您正在使用 Python。 SleekXMPP 是一个不错的入门库,它也是 XMPP: The Definitive Guide book 中用于代码示例的库。

更多信息:

Github:https://github.com/fritzy/SleekXMPP 文档:http://sleekxmpp.readthedocs.org/en/latest/ 皮皮:https://pypi.python.org/pypi/sleekxmpp

【讨论】:

我最终阅读,直到我得到一个结束标签,例如。 '' 或类似的。但是,您的解决方案是更好的方法。我这样做是为了学习 Python,python 服务器永远不会取代我当前运行的服务器。 您知道,您的解决方案是不正确的,因为嵌套消息标签是完全有效的。一个简单的实际示例是转发消息时:xmpp.org/extensions/xep-0297.html#example-2 谢谢,不知道,但是这种消息“永远不会”从谷歌云消息发送。但正如你所说,我可能会实施,所以我可以在完成阅读之前检查所有标签/元素是否已关闭。

以上是关于GCM,我怎么知道 XMPP 数据包的结束?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 slimxmpp python 中为 gcm ccs 请求创建 xmpp 节?

如何在 Android 上实现 XMPP Server 以及与 GCM 的通信?

通过 GCM 和 xmpp 输入状态/在线状态

是否可以将 GCM 云连接服务器 (XMPP) 与 Heroku 应用程序一起使用?

我应该如何在 java 上部署 XMPP 服务器 GCM 以便 GCM 可以访问它并发送消息?

无法使用 Node.js + XMPP 接收上游 GCM 消息