Android应用连接本地OpenFire XMPP服务器遇ResolutionUnsuccessfulException
解决Android连接本地OpenFire时的NX_DOMAIN错误
我来帮你搞定这个问题!从报错信息来看,核心问题是Smack库把你指定的IP地址当成域名去做DNS解析了,而IP本身不是一个合法的域名,所以DNS服务器返回了NX_DOMAIN(找不到域名记录)的错误。下面是具体的解决步骤和修改后的代码:
错误原因分析
你虽然在代码里设置了setHost(ip),但Smack默认会尝试对这个主机地址做DNS SRV记录查找,同时会把IP当作域名去查询A记录——这显然是行不通的,因为IP不是域名,自然查不到对应的DNS记录,就抛出了这个异常。
修改后的代码示例
import java.net.InetAddress import org.jivesoftware.smack.ConnectionConfiguration.DnsLookupMode import org.jivesoftware.smack.tcp.XMPPTCPConnection import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration try { val ip = "xxx.xxx.xx.xx" // 你的OpenFire服务器IP val username = "你的用户名" val password = "你的密码" val domain = "你的XMPP域名(比如OpenFire设置里的domain)" val config = XMPPTCPConnectionConfiguration.builder() .setUsernameAndPassword(username, password) .setHost(ip) // 直接指定IP对应的InetAddress,跳过DNS解析 .setHostAddress(InetAddress.getByName(ip)) .setXmppDomain(domain) // 禁用DNS查找,避免不必要的解析操作 .setDnsLookupMode(DnsLookupMode.NONE) // 禁用主机名验证(因为用IP连接,SSL验证会失败,测试环境用) .setDisableHostnameVerification(true) // 明确指定OpenFire的XMPP端口,默认是5222 .setPort(5222) .build() val connection = XMPPTCPConnection(config) connection.connect() connection.login() // 连接成功后的操作 } catch (e: Exception) { e.printStackTrace() }
关键设置说明
setHostAddress(InetAddress.getByName(ip)):直接传入IP对应的网络地址对象,告诉Smack直接连接这个IP,不需要再做任何DNS解析;setDnsLookupMode(DnsLookupMode.NONE):彻底关闭所有DNS相关的查找逻辑,从根源上避免解析错误;setDisableHostnameVerification(true):因为我们用IP而非域名连接,默认的SSL/TLS主机名验证会失败,测试环境下可以禁用这个验证(生产环境建议配置合法的SSL证书);setPort(5222):明确指定OpenFire的默认XMPP端口,避免端口匹配错误。
额外检查点
- 确认OpenFire服务器的5222端口已经开放,并且服务器的防火墙(比如Windows防火墙、Linux iptables)允许该端口的入站连接;
- 确保你的Android应用已经在
AndroidManifest.xml中添加了互联网权限:<uses-permission android:name="android.permission.INTERNET" /> - 验证OpenFire后台已经创建了对应的用户,且用户名、密码正确,用户状态为启用。
内容的提问来源于stack exchange,提问作者Héctor Valls
相关产品推荐
相关产品推荐

