Smack踩坑:ResolutionUnsuccessfulException,yielded an error response NX_DOMAIN

最近又在搞XMPP聊天模块,遇到了一个关于openfire服务器地址配置的坑,写篇笔记记录下来。
在Android客户端使用Smack设置服务器地址的函数有

  • setHost:设置openfire服务器的hostName
  • setHostAddress:设置openfire地址的ip地址
  • setHostnameVerifier:没用过,不赘述

问题描述

由于之前服务器地址都是hostName的形式,我的XMPPTCPConnectionConfiguration都是以setHost的形式设置服务器地址。但是最近由于内网解析的问题,后台同事把服务器地址从hostName格式换成IP地址格式。
导致了我的IM模块一直连不上,要命的我根本没有发现这点。看Smack日志一直提示

The following addresses failed: '192.168.0.4:5222' failed because: 
de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for 192.168.0.4.
IN  A yielded an error response NX_DOMAIN, '192.168.0.4:5222' failed because: 
de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for 192.168.0.4.
IN  AAAA yielded an error response NX_DOMAIN

一开始以为是我的port缓存出现错误,我们的port从5222改成55222。然后用wireshark抓包却发现根本没有192.168.0.4:5222的包,后来仔细看代码才发现是hostName和IP地址之间的区别(看来真的老了老了,脑阔年老失修啊)。

解决办法

判断平台返回的openfire服务器地址是ip地址格式还是hostName格式。下面分享一个判断IPV4格式地址额函数

   private static final String REG = "[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}";

    private boolean isIp(String serverUrl) {
        return Pattern.matches(REG, serverUrl);
    }

如果服务器返回的IP地址是IPV6格式的话,将正则表达式改改就可以用了
判断了openfire服务器地址格式之后,ip地址格式调用setHostAddress函数,hostName格式调用setHost格式即可。
码代码果然要细心啊黑脸

你可能感兴趣的:(Smack踩坑:ResolutionUnsuccessfulException,yielded an error response NX_DOMAIN)