【问题标题】:best way to exchange custom XML elements in XMPP?在 XMPP 中交换自定义 XML 元素的最佳方式是什么?
【发布时间】:2011-05-12 11:31:02
【问题描述】:

我有一个 XMPP 应用程序,其中两个客户端交互 (1) 使用 Smack (Scala/Java) 编程的机器人和 (2) 使用 strophe (Javascript) 编程的 GUI 聊天客户端。

应用需要交换自定义XML(例如,如下图)

<myPacket>
   <response type='sensorData'>
      <temperature units='Kelvin'>
         234
      </temperature>
   </response>
</myPacket>

交换数据的最佳方式是什么?以下是我能想到的:

1) 编写自定义 XMPP 节

2) 将我的 XML 嵌入当前定义的节中(例如,在 message 或 iq 中)

3) 给我点赞,use the Message.get(set)Property to read/write custom data

没有。 3) 被排除在外,因为它要求两个客户端都理解 Java 对象并使用相同的库 (Smack)。

请指出解决同一问题的任何其他问题。

[编辑:] 在做了一些研究之后,我发现 Dataforms (XEP-0004) 是最简单的方法,只要你的库支持它。

【问题讨论】:

  • 使用您自己的命名空间的相应 XMPP 节中的 子元素从您的客户端发送自定义 xml 数据。例如。 ... 。这样的节将反过来被您的客户端机器人接收,而无需任何其他配置。
  • 感谢您的评论。我最终决定将 子元素与数据表单一起使用。
  • 我发现 dataforms (XEP-004) 在 smack 中并不完全完整。最好使用自定义编码(例如,消息节中的 JSON)。这就是我们最终在所有地方都在做的事情。

标签: xml xmpp


【解决方案1】:

这在很大程度上取决于数据的使用方式。我的经验法则是,如果我只传递键值对(简单数据),那么我会选择 Smack 中的属性功能。但是属性特性只能在Message中使用。出于某种原因,属性扩展不使用 Smack 的提供程序架构,而是硬编码到 PacketPacketParserUtils 类中。因此,如果您不能在 IQ 或 Presence 数据包中重复使用它。

如果您要使用的不仅仅是键值对,那么您应该为您的自定义节编写一个提供程序。这需要一些工作,但是一旦您实现了编组/解组,那么您的自定义节几乎可以在 Smack 框架中的任何地方工作。有关详细信息,请参阅 Smacks provider architecture

我在我的post 之一中写过关于写作提供者的博客。这不是帖子的主要信任,但希望您也觉得它有帮助。

【讨论】:

  • 感谢您的回答。我认为 Smack 属性功能仅限于 Smack-only 代码,所以这不是一个好的选择。我将查看实现自己的节的提供程序架构。这篇博文很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2012-06-30
  • 2011-10-06
  • 2015-12-11
相关资源
最近更新 更多