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函数的连接进行垃圾收集)。