gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:27:49 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com