XMPP同一用户问题的多个会话

时间:2012-02-27 05:35:55

标签: javascript xmpp strophe bosh punjab

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

谢谢。

4 个答案:

答案 0 :(得分:27)

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

JID的格式为:user@domain/resource

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

现在,当用户发送消息时,to节的<message>属性指定了消息的收件人。如果资源是收件人的一部分,那么只有该JID才会收到该消息。如果收件人是一个简单的JID(用户@域),那么优先级就会发挥作用(参见here):

  1. 在任何给定时间具有最高优先级的资源将是接收传入消息的资源。
  2. 如果两个或多个资源具有相同的优先级,则具有所述优先级的所有资源可以接收传入消息,或者根据服务器特定的标准,可以接收服务器实现。
  3. 如果所有连接的资源都具有否定优先级,则传入的消息将在服务器端排队,直到其中一个资源将优先级重置为正数。
  4. 您可以在发送状态时设置优先级([-128,127]中的整数)(例如,请参阅rfc获取完整规范):

    <presence>
      <status>Learning XMPP</status>
      <priority>1</priority>
    </presence>
    

答案 1 :(得分:10)

如果您想要进行整个对话,包括从客户端发送的消息以显示在另一个会话中,那么Carbons就是您正在寻找的功能。我implemented this in a pluginProsody

所需的客户端部分不应该太难写,here's it done in the Verse library

答案 2 :(得分:4)

长话短说!

使用:

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

而不是:

mXmppConnection.login (USERNAME, PASSWORD);

最后一个名为resource的参数,代表您登录的电台。

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

答案 3 :(得分: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模块,则需要将其激活。