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

12
我已经实现了一个Chrome扩展程序,它可以通过BOSH连接与运行在远程服务器上的Punjab服务器一起使用XMPP聊天。该扩展程序是使用JavaScript库Strophe实现的。我遇到的问题是当同一用户有多个会话(例如,在同一台机器上运行两个不同的浏览器)时,我无法从第一个聊天窗口接收和记录消息并在第二个聊天窗口中显示。需要一些机制来解决这个问题。我是否能够以某种方式接收发送给其他用户的消息?这个问题也可以在2台或更多不同的计算机上复制,因此需要解决这个问题。
谢谢。
4个回答

27

你需要了解JID是如何工作的,什么是优先级以及如何发送消息。

JID的格式为:user@domain/resource

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

现在,当用户发送消息时,<message>节的to属性指定消息的接收者。如果资源是接收者的一部分,则只有该JID将接收消息。如果接收方是裸JID(user@domain),则优先级发挥作用(请参见此处):

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

您可以在发送状态时设置优先级(在[-128, 127]中的整数)(请参见rfc以获取完整规范),例如:

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

3
第二点不准确。它可能会按照定义向所有人发送消息,也可能基于其他实现特定的标准仅向一个收件人发送消息。参见第11.1节入站信息。虽然如此,这仍然是一个很好的回答。 - Robin
@Robin 哦,这主要是由于内存不足,当然你是对的。我会进行修改。 - ggozad

11

4

简而言之!

用途:

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

而不是:

mXmppConnection.login (USERNAME, PASSWORD);

最后一个参数称为资源(resource),代表您登录的站点。
这样,您可以使用相同的用户名登录,但仍然可以从两个设备登录。

0
如果您在检测到多个登录时启用了碳:XEP-0280: Message Carbons,XMPP服务器将向您在不同设备上登录的其他会话发送一个碳消息。
<enable xmlns='urn:xmpp:carbons:2'/>

记得在所有会话中启用它。这样,两个会话都将接收到发送和接收的消息。对于接收消息的情况,如果您启用了“carbon”,在在线状态下将不会受到影响。

再次提醒,如果您不希望某条消息被抄送,请在stanza内添加<private/><no-copy/>

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接