当有人在 smackx 中加入或离开 MultiUserChat 时,如何找出房间的入住者?
Posted
技术标签:
【中文标题】当有人在 smackx 中加入或离开 MultiUserChat 时,如何找出房间的入住者?【英文标题】:How to find out the room occupants when someone joined or left a MultiUserChat in smackx? 【发布时间】:2013-03-05 16:35:48 【问题描述】:我正在尝试使用 smackx api 实现 MultiUserChat。
到目前为止,我设法创建了一个新的 MultiUserChat 房间,加入它并发送邀请。我现在的问题是如果有人加入或离开聊天室,如何找出谁在聊天室。我认为在聊天室中添加一个在线监听器可能会奏效:
muc.addParticipantListener(new PacketListener()
@Override
public void processPacket(Packet packet)
System.out.println("user count changed, now:" + muc.getOccupcantsCount());
);
addParticipantListener
状态的 Javadoc
添加一个数据包侦听器,该侦听器将收到发送到群聊的任何新 Presence 数据包的通知。使用侦听器是一种合适的方式来了解何时应重新加载由于任何更改而应重新加载的居住者列表。
所以我认为这会起作用。但是,在 processPacket
方法中,muc.getOccupantsCount()
和 muc.getOccupants()
都在 processPacket
调用之前返回值。
因此,如果聊天室中只有一个用户,而另一个用户加入,则输出将是
用户数已更改,现在:1
如果有两个用户和另一个加入,输出是
用户数已更改,现在:2
如果有三个用户,一个离开,输出是
用户数已更改,现在:3
分别地,muc.getOccupants()
在processPacket
中调用时不会给我刚刚加入的用户,而仍然给我刚刚离开的用户。
如何从processPacket
中有效地找出聊天室中的当前人员?
【问题讨论】:
我有一个问题,我们如何在没有房间的情况下添加邀请监听器(如果没有房间名称,我们如何初始化 MultiuserChat?) 【参考方案1】:你不能。不在PacketListener
和muc.getOccupantsCount()
内。
占用人数也是determined by using a PacketListener
within smackx。并且不能保证这个PacketListener
在你之前运行,因此有机会更新居住人数。
现在解决它的一种方法是检查存在数据包并与当前成员列表进行交叉检查。基本上和内置的存在监听器一样。或者您可以人为地延迟操作,以便所有PacketListeners
都有机会完成。
我创建了SMACK-424 来在 Smack 中跟踪此问题。
【讨论】:
感谢您澄清这一点。作为一种解决方法,我现在使用((Presence) packet).isAvailable()
检查PacketListener
中用户的状态,并相应地更新一组内部用户名。【参考方案2】:
这是一个很好的问题,找出这些方法(例如getOccupants()、getOccupantsCount())在实际效果中的不足之处。
如您所见,关键问题是 PacketListeners 无法及时响应。所以你需要的是检测用户状态活动。使用Presence检测用户状态是保证用户信息及时更新的有效方法。此外,可能还有其他方法可以实现。
【讨论】:
【参考方案3】:对于您的新问题,如果没有房间名称,我们如何初始化 MultiuserChat,我找到了 MultiUserChat 的源代码,并且只声明了一个构造函数:
public MultiUserChat(Connection connection, String room)
this.connection = connection;
this.room = room.toLowerCase();
init();
【讨论】:
以上是关于当有人在 smackx 中加入或离开 MultiUserChat 时,如何找出房间的入住者?的主要内容,如果未能解决你的问题,请参考以下文章
ClassCastException: org.jivesoftware.smack.PacketReader$4 在传输文件时无法转换为 org.jivesoftware.smackx.packet
asmack 是不是有类似于 smackx 的扩展 jar?