基于openfire4.3.2+smack4.3.3,版本不同可能不适用。
一、openfire如何实现多端登录
openfire默认支持多端登录,即可以使用同一个账号,登录多个客户端。
比如,在Android、iOS、PC上同时登录,只需要保证客户端的【资源】不同即可,Android指定资源为Android,iOS指定资源为iOS,PC指定资源为PC等
【资源】就是username@domain.com/resource中的resource。
如果,同一账号使用同一【资源】在多端登录,那么后登录的客户端将会把先登录的客户端“顶下线”。
使用openfire4.3.2+smack4.3.3,如果不指定【资源】,会自动生成随机【资源】,所以默认就可以多端登录了。
//生成username@domain.com/resourse
getConnection().login("username", "password", "resourse");
//生成username@domain.com/6tr9j18eq7
getConnection().login("username", "password");
二、openfire多端登录,收不到消息,只有一个客户端可以收到消息
openfire按如下路由规则,处理消息发送
- 选资源优先级最高的客户端发送消息
- 选在线状态具有最高等级的,openfire在线状态由高到低依次为chat-找我聊天吧、available-在线、away-离开、xa-长时间离开、dnd-不要打搅我
- 选最近最活跃的客户端
可以看出openfire默认是不会向多个客户端发送消息的
smack4.3.3中设置【资源】的优先级,如下
getConnection().sendStanza(new Presence(Presence.Type.available, "在线", 1, Presence.Mode.available));
三、openfire多端登录,多端都收到消息怎么实现?
- 保证客户端的【资源】不同
- 在openfire管理后台Server->Server Manager->System Properties中添加一个新的属性:route.all-resources=true
- 将客户端的连接都设置为最高优先级
- 在发送消息时,不指定【资源】
四、openfire多端互踢如何实现
这和openfire的另一个配置:xmpp.session.conflict-limit有关
同一账号,同一【资源】多端登录。openfire会判断当前服务器中是否存在session。无则直接创建session。
如果有,再判断是否大于xmpp.session.conflict-limit,若大于,就直接把之前的session给剔除。
若小于xmpp.session.conflict-limit openfire不会剔除session,但会发送错误信息,session保持链接。
xmpp.session.conflict-limit=-1 表示永不互踢。
所以,实现openfire多端互踢需要
- 设置xmpp.session.conflict-limit=0
- 同一账号,使用同一资源登录
参考:https://blog.csdn.net/jwzhangjie/article/details/12036131/
五、openfire消息漫游
openfire暂不支持消息漫游。如需实现消息漫游可参考:http://www.91im.net/im/4576.html
版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。