您的位置:首页 > 编程语言 > Java开发

Smack Roster获取不到名册

2016-11-25 17:23 405 查看
最近搞OpenFire,一直在摸索一个XMPP协议的java lib: smack

今天遇到一个很蛋疼的问题,记录一下。

Roster用来获取名册的类,但是按照文档里面那么写,获取到的Roster永远为空。

/**
* Created by Mario on 2016/11/25 0025.
* Roster demo
*/
public class SmackRosterDemo {
public static void main(String[] args) throws IOException, XMPPException, SmackException, InterruptedException {
SmackConfiguration.DEBUG = true;
XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setServiceName("mario");
configBuilder.setUsernameAndPassword("mario", "123.com");
configBuilder.setResource("Spark");
configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
XMPPTCPConnection connection = new XMPPTCPConnection(configBuilder.build());
connection.connect();
connection.login();
System.out.println(connection.isAuthenticated());
Roster roster = Roster.getInstanceFor(connection);
Collection<RosterEntry> entries = roster.getEntries();
entries.forEach(System.out::println);

Thread.sleep(1000000);
connection.disconnect();
}
}


这是我的代码,entries.forEach(System.out::println);不会有任何的输出。这让我郁闷了一天,调试着玩的时候,偶然输出了一次名单,多次试验发现了一个奇怪的事情····

.......
connection.login();
System.out.println(connection.isAuthenticated());
Thread.sleep(100);//看这里!!!
Roster roster = Roster.getInstanceFor(connection);
Collection<RosterEntry> entries = roster.getEntries();
entries.forEach(System.out::println);
.......


connection.login()之后,sleep一下,就可以获取到名册了。

这是输出:

true
luigi: luigi@mario [Friends]


坑真多啊,有哪个大神知道原因,求告诉~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openfire java xmpp smack roster