Java 当有人加入或离开smackx中的多用户聊天室时,如何找出房间的居住者?

Java 当有人加入或离开smackx中的多用户聊天室时,如何找出房间的居住者?,java,xmpp,smack,Java,Xmpp,Smack,我正在尝试使用SMACKXAPI实现多用户聊天 到目前为止,我设法创建了一个新的多用户聊天室,加入其中,并发出邀请。我现在的问题是,如果有人加入或离开聊天室,如何找出聊天室中的人。我认为在聊天室中添加一个状态监听器可以达到以下目的: muc.addParticipantListener(new PacketListener() { @Override public void processPacket(Packet packet) { System.out.pr

我正在尝试使用SMACKXAPI实现多用户聊天

到目前为止,我设法创建了一个新的多用户聊天室,加入其中,并发出邀请。我现在的问题是,如果有人加入或离开聊天室,如何找出聊天室中的人。我认为在聊天室中添加一个状态监听器可以达到以下目的:

muc.addParticipantListener(new PacketListener() {

    @Override
    public void processPacket(Packet packet) {
        System.out.println("user count changed, now:" + muc.getOccupcantsCount());
    }
});
addParticipantListener
的Javadoc状态

添加一个数据包侦听器,该侦听器将收到发送到群组聊天的任何新状态数据包的通知。使用侦听器是一种适当的方法,可以知道由于任何更改,何时应重新加载居住者列表

所以我认为这会奏效。但是,在
processPacket
方法中
muc.getoccountscont()
以及
muc.getaccounters()
都返回调用
processPacket
之前的值。 因此,如果聊天室中只有一个用户,另一个用户加入,则输出将是

用户数已更改,现在为:1

如果有两个用户和另一个用户加入,则输出为

用户数已更改,现在为:2

如果有三个用户和一个离开,则输出为

用户数已更改,现在为:3

分别,
muc.getOccumers()
不会给我在
processPacket
中调用时刚刚加入的用户,仍然会给我刚离开的用户


如何从
processPacket
中有效地找出聊天室中的当前用户?

您不能。不在
PacketListener
muc.getOccupentScont()

乘客人数也在增加。而且不能保证此
PacketListener
在您之前运行,因此有机会更新占用人数

现在解决这个问题的一种方法是检查存在数据包并与当前成员列表交叉检查。基本上与内置的状态侦听器执行相同的操作。或者您可以人为地延迟操作,以便所有的
PacketListeners
都有机会完成


我创建了Smack来跟踪这个问题。

这是一个很好的问题,并找到了这些方法在实际效果中的不足之处(例如GetOccupers()、GetOccupentScont())


如您所见,关键问题是PacketListeners无法及时响应。因此,您需要的是检测用户状态活动。利用状态信息检测用户状态是保证用户信息及时更新的有效方法。此外,可能还有其他方法来实现它。

对于您的新问题,即如果没有房间名称,我们如何初始化MultiuserChat,我找到了MultiuserChat的源代码,并且只声明了一个构造函数:

 public MultiUserChat(Connection connection, String room) {
        this.connection = connection;
        this.room = room.toLowerCase();
        init();
    }

谢谢你澄清这一点。作为一种解决方法,我现在使用
((Presence)packet).isAvailable()
检查
PacketListener
中用户的状态,并相应地更新一组内部用户名。我有一个问题,我们如何在没有聊天室的情况下添加invitatuion listener(如果没有聊天室名称,我们如何初始化多用户聊天?)