java - 为什么向 User-B 注册的数据包监听器不起作用?

标签 java xmpp smack

userauserb 发送订阅请求。执行以下代码后,只有 usera 能够在其名册列表中看到 userb,而看不到 userb。这是为什么?

首先调用函数userB,然后在该函数中调用userA。我已经为 userb 注册了一个 packetListener 但令我惊讶的是它不起作用!我通过尝试打印语句来测试它,但我没有看到任何输出。所以监听器没有被执行。这可能是什么原因?

以下代码中发生的情况如下:

userB ---activates packet listener-----> userA
  |                                         |
  |                                         |
  |                                       sends request to userB
  |                                         |
 / \                                       \ /
  |--------------------<--------------------|                                          |


public void userB() {
    try {
        final Connection connection = new XMPPConnection("localhost");
        connection.connect();
        connection.login("userb", "passb");

        Roster r = connection.getRoster();
        r.setSubscriptionMode(Roster.SubscriptionMode.manual);

        PacketListener pListener = new PacketListener() {                
            @Override
            public void processPacket(Packet packet) {
                if(packet instanceof Presence) {
                    Presence presence =(Presence)packet;
                    if(presence.getType().equals(Presence.Type.subscribe)) {
                        System.out.println("Inside the first if statement");
                        Presence newP = new Presence(Presence.Type.subscribed);
                        newP.setMode(Presence.Mode.available);
                        newP.setTo(presence.getFrom());
                        connection.sendPacket(newP);

                        Presence subscription = new Presence(Presence.Type.subscribe);
                        subscription.setTo(presence.getFrom());
                        connection.sendPacket(subscription);
                    }
                }
            }
        };

        PacketFilter pFilter = new PacketFilter() {
            @Override
            public boolean accept(Packet packet) {
                if(packet instanceof Presence) {
                    Presence presence = (Presence)packet;
                    if(presence.getType().equals(Presence.Type.subscribe)) {
                        System.out.println("Inside if statement");
                        return true;
                    }
                }
                return false;
            }
        };

        connection.addPacketListener(pListener, pFilter);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                userA();
            }
        };
        new Thread(runnable).start();
        //connection.disconnect();
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}

public void userA() {
    try{
        Connection connection = new XMPPConnection("localhost");
        connection.connect();
        connection.login("usera","passa");

        Presence subscribe = new Presence(Presence.Type.subscribe);
        subscribe.setTo("userb@localhost");
        connection.sendPacket(subscribe);
        connection.disconnect();
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}

最佳答案

你的代码看起来没问题。但你只会在第一次(当你真正订阅时)得到一个订阅包。随后,这些数据包显然会被过滤掉,因为您已经订阅了。

尝试使用两个新用户运行您的代码。

关于java - 为什么向 User-B 注册的数据包监听器不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18342152/

相关文章:

ios - XMPP ejabberd SaaS 推送通知

android - Smack,在创建新的 MultiChat 时出错

android - 如何保持与 Smack XMPP 的连接?

java - swt jface tableviewer 按数据获取行

java - 具有多个值的开关大小写

node.js - 在 Windows 7 上安装 Node-xmpp

ios - 在 iOS 中通过 XMPP MessageArchiving 保存 XMPP 多用户聊天消息

android - 如何使用 (a)Smack 库在 XMPP 上注册新用户

java - 如何从服务器获取太大的图像?

java - 如何检测启动器主屏幕是否支持旋转