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();
}
}
您的代码似乎很好。但您只有在第一次(当您实际订阅时)才能获得订阅数据包。随后,这些数据包会被过滤掉,显然是因为您已经订阅了。
尝试与两个新用户一起运行代码。