Android xmpp错误主机未知

Posted

技术标签:

【中文标题】Android xmpp错误主机未知【英文标题】:Android xmpp error host-unknown 【发布时间】:2016-07-11 19:11:19 【问题描述】:

我正在尝试与 xmpp 服务器建立连接,这会返回此错误。

W/AbstractXMPPConnection:连接因错误而关闭 org.jivesoftware.smack.XMPPException$StreamErrorException: host-unknown 您可以阅读有关此流错误含义的更多信息 在http://xmpp.org/rfcs/rfc6120.html#streams-error-conditions 在 org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1003) 在 org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:944) 在 org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:959) 在 java.lang.Thread.run(Thread.java:818)

我尝试在github 中使用此示例并放入此数据。

private static final String DOMAIN = "10.20.0.125"; 

private static final String HOST = "10.20.0.125"; 

private static final int PORT = 5222;

private String userName ="admin2@localhost";

private String passWord = "asdfasdf";

服务器没问题,我们换了一台测试电脑在android上进行通信,但这个错误仍然存​​在。

【问题讨论】:

【参考方案1】:

我主要看到两个错误:

在演示配置中你有这行代码:

XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
    configBuilder.setUsernameAndPassword(userName, passWord);
    configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
    configBuilder.setResource("Android");
    configBuilder.setServiceName(DOMAIN);
    configBuilder.setHost(HOST);
    configBuilder.setPort(PORT);

第一个问题(主要问题): 域变量应该(但必须)是您可以在服务器配置中读取的服务器名称,而不仅仅是 IP;某些功能会在 localhost 之外中断。

第二个问题: 虽然我建议从配置中分离登录(所以只需配置连接然后登录)我不明白的是用户名: localhost 将不会在服务器机器之外解析,所以再次 必须用域名替换(即使理论上,连接会给用户他的域名,不需要那么明确)。

所以:

 connection.connect();
 login();

将被替换为

 connection.connect();
 login(userName ,passWord,"Android" );

你需要删除这 2 行:

configBuilder.setResource("Android");
configBuilder.setUsernameAndPassword(userName, passWord);

关于域名:您可以在服务器配置中找到它,在 Openfire 中它是“服务器名称”,您可以在服务器信息页面的 Web 界面中阅读。

【讨论】:

我进行了必要的更改,但在执行 connection.login (LoginUser, passwordUser, RESOURCE_TYPE) 时出现以下错误:登录:java.lang.NullPointerException:尝试调用接口方法 'byte[ ] org.jivesoftware.smack.util.stringencoder.Base64$Encoder.encode(byte[], int, int)' 在空对象引用上 “RESOURCE_TYPE”的值是多少?您是否在服务器上注册了您的用户?但是我认为这是另一个问题... 我认为不需要新票。因为这个错误是在执行提供的修正时出现的!但是指定了RESOURCE_TYPE(如“Android”),以防万一在登录中删除重新测试,问题依然存在。 如您所愿,但至少对我而言,很难跟进一个不再是原始问题中的代码和一个您尚未完全粘贴的新堆栈跟踪。【参考方案2】:

我设法找到了解决方案。 我使用的是 .jar 文件而不是编译 gradle 依赖项:

compile 'org.igniterealtime.smack:smack-android:4.1.4'
compile 'org.igniterealtime.smack:smack-tcp:4.1.4'
compile 'org.igniterealtime.smack:smack-im:4.1.4'
compile 'org.igniterealtime.smack:smack-extensions:4.1.4'

因此错误已解决。感谢您的帮助。

【讨论】:

以上是关于Android xmpp错误主机未知的主要内容,如果未能解决你的问题,请参考以下文章

在不公开服务名称和主机名的情况下使用 Android XMPP Smack

未知主机“dl.google.com”。您可能需要在 gradle un Android 4.2 中调整代理设置

android中的XMPP连接错误

使用 OMEMO 加密在 XMPP MultiUserChat 中向未知用户发送消息

创建用户时 XMPP jid-malformed(400) 错误 Android

XMPP android中的连接因错误而关闭