当有人加入或离开smaUx中的MultiUserChat时,如何找出房间的居住者?

时间:2013-03-05 16:35:48

标签: java xmpp smack

我正在尝试使用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内有效地找出聊天室中的用户?

3 个答案:

答案 0 :(得分:3)

你做不到。不属于PacketListenermuc.getOccupantsCount()

占用人数也是determined by using a PacketListener within smackx。并且无法保证此PacketListener在您之前运行,因此有机会更新占用人数。

现在解决它的一种方法是检查在线数据包并与当前成员列表进行交叉检查。基本上和内置的状态监听器一样。或者你可以人为地推迟行动,以便所有PacketListeners都有机会完成。

我创建了SMACK-424来跟踪Smack中的这个问题。

答案 1 :(得分:0)

这是一个很好的问题,找出这些方法在实际效果上的不足(例如,getOc​​cupants(),getOc​​cupantsCount())。

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

答案 2 :(得分:0)

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

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