我已经实现了chrome扩展,允许在远程服务器上运行的punjab服务器上使用BOSH连接进行XMPP聊天。它是使用javascript Strophe库实现的。我遇到的问题是当我有同一个用户的多个会话(例如同一台机器上的两个不同的浏览器)时,我无法接收并将第一个聊天窗口发送的消息记录到第二个聊天窗口。需要有一些机制允许这样做。我可以以某种方式接收我发送给其他用户的消息吗?该问题也可以在2台或更多台机器上重现,因此也需要解决。
谢谢。
答案 0 :(得分:27)
您需要了解JID的工作原理,优先级以及如何发送消息。
JID的格式为:user@domain/resource
登录用户的JID必须是唯一的。通常,当您使用Web客户端时,您会为每个会话分配一个随机资源,以便不会发生冲突。
现在,当用户发送消息时,to
节的<message>
属性指定了消息的收件人。如果资源是收件人的一部分,那么只有该JID才会收到该消息。如果收件人是一个简单的JID(用户@域),那么优先级就会发挥作用(参见here):
您可以在发送状态时设置优先级([-128,127]中的整数)(例如,请参阅rfc获取完整规范):
<presence>
<status>Learning XMPP</status>
<priority>1</priority>
</presence>
答案 1 :(得分:10)
如果您想要进行整个对话,包括从客户端发送的消息以显示在另一个会话中,那么Carbons就是您正在寻找的功能。我implemented this in a plugin已Prosody。
所需的客户端部分不应该太难写,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模块,则需要将其激活。