Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么向User-B注册的数据包侦听器不工作?_Java_Xmpp_Smack - Fatal编程技术网

Java 为什么向User-B注册的数据包侦听器不工作?

Java 为什么向User-B注册的数据包侦听器不工作?,java,xmpp,smack,Java,Xmpp,Smack,usera向userb发送订阅请求。执行以下代码后,只有usera能够在他的花名册列表中看到userb,但不能看到userb。为什么呢 首先调用函数userB,然后在此函数中调用userA。我已经为userb注册了一个packetListener,但令我惊讶的是它不起作用!我试着打印一条语句来测试它,但没有看到输出。因此侦听器没有被执行。这可能是什么原因 下面是以下代码中发生的情况: userB ---activates packet listener-----> userA |

usera
userb
发送订阅请求。执行以下代码后,只有
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();
    }
}
userB---激活数据包侦听器------>userA
|                                         |
|                                         |
|向userB发送请求
|                                         |
/ \                                       \ /

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


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

同样的情况也会发生<代码>用户A
能够在其名册中看到
用户B
,但
用户B
在其名册中看不到
用户A
。最初的问题是,为什么没有呼叫听众。我猜他们现在被调用了,对吧?UserA向userB发送一个“订阅”数据包。UserB发回一个“订阅”数据包,并向UserA发送一个“订阅”请求。但是UserA从不发回“订阅的”数据包。我测试了两个新用户,但我发现,即使在创建了一个新用户之后,
processPacket
函数也不会被调用。我尝试在函数开始后打印一些内容,但没有打印任何内容。另一方面,正在调用accept函数。我在本地测试了您的代码,它在我这边工作。一种可能的解释是,userB()函数在来自userA的数据包到达之前结束(从而对来自userB函数的连接进行垃圾收集)。