4

我正在尝试使用 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 个用户和 1 个离开,则输出为

用户数已更改,现在:3

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

如何从内部有效地找出当前在聊天室的人processPacket

4

3 回答 3

3

你不能。不在 aPacketListener和内muc.getOccupantsCount()

乘员人数也通过使用PacketListenerwithin smackx来确定。并且不能保证这PacketListener会在您之前运行,因此有机会更新乘员人数。

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

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

于 2013-03-06T12:51:14.670 回答
0

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

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

于 2018-06-28T04:39:58.623 回答
0

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

 public MultiUserChat(Connection connection, String room) {
        this.connection = connection;
        this.room = room.toLowerCase();
        init();
    }
于 2018-06-28T15:45:35.203 回答