最近又在搞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
格式即可。
码代码果然要细心啊黑脸