12

我已经实现了一个 chrome 扩展,它允许通过 BOSH 连接使用 XMPP 聊天与远程服务器上运行的旁遮普服务器。它是使用 javascript Strophe 库实现的。我遇到的问题是当我有同一个用户的多个会话(例如,同一台机器上的两个不同浏览器)时,我无法接收我从第一个聊天窗口发送的消息并将其登录到第二个聊天窗口。需要某种机制来实现这一点。我能以某种方式接收我发送给其他用户的消息吗?该问题也可以在 2 台或更多不同的机器上重现,因此这也需要解决。

谢谢你。

4

4 回答 4

27

您需要了解 JID 的工作原理、优先级是什么以及如何发送消息。

JID 的形式为:user@domain/resource

登录用户的 JID 必须是唯一的。通常,当您使用 Web 客户端时,您会为每个会话分配一个随机资源,以免发生冲突。

现在,当用户发送消息时,节的to属性<message>指定消息的接收者。如果资源是接收者的一部分,那么只有那个 JID 会收到消息。如果收件人是一个裸 JID (user@domain),那么优先级就会起作用(见这里):

  1. 在任何给定时间具有最高优先级的资源将是接收传入消息的资源。
  2. 如果两个或更多资源具有相同的优先级,则具有所述优先级的所有资源都可以接收传入消息,或者取决于服务器实现,一个可以接收取决于服务器特定的标准。
  3. 如果所有连接的资源都具有负优先级,则传入消息将在服务器端排队,直到其中一个资源将优先级重置为正。

您可以在发送出席信息时设置优先级([-128, 127] 中的整数)(请参阅rfc以了解完整规范),例如:

<presence>
  <status>Learning XMPP</status>
  <priority>1</priority>
</presence>
于 2012-02-27T15:48:23.000 回答
11

如果您想进行整个对话,包括您客户发送的消息以显示在另一个会话中,那么Carbons就是您正在寻找的功能。我已经在Prosody的插件中实现了这一点。

所需的客户端部分应该不会太难写,这是在 Verse 库中完成的

于 2012-02-28T00:55:31.117 回答
4

长话短说!

利用:

mXmppConnection.login (USERNAME, PASSWORD, StationName/NickName);

并不是:

mXmppConnection.login (USERNAME, PASSWORD);

最后一个参数称为资源,代表您登录的站点。

这样您就可以使用相同的用户名登录,但仍然可以从 2 台设备登录。

于 2013-07-22T23:35:51.860 回答
0

如果您在检测到多个登录时启用 Carbons: XEP-0280: Message Carbons,XMPP 服务器将向您在不同设备上登录的其他会话发送一条 carbon 消息

<enable xmlns='urn:xmpp:carbons:2'/>

请记住为所有会话启用它。因此,两个会话都会收到发送和接收消息。对于接收消息的情况,如果您启用了碳,则在场将不会生效。

同样,如果您希望消息不是抄送,请 在节内添加<private/>,<no-copy/>

<private xmlns='urn:xmpp:carbons:2'/>
<no-copy xmlns='urn:xmpp:hints'/>

如果您的 XMPP 服务器中未激活 carbons 模块,您需要激活它。

于 2019-08-19T07:54:26.117 回答