为什么向用户B注册的数据包侦听器不工作



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();
    }
}

您的代码似乎很好。但您只有在第一次(当您实际订阅时)才能获得订阅数据包。随后,这些数据包会被过滤掉,显然是因为您已经订阅了。

尝试与两个新用户一起运行代码。

最新更新