最近又在搞XMPP聊天模塊副砍,遇到了一個關(guān)于openfire服務(wù)器地址配置的坑,寫篇筆記記錄下來井厌。
在Android客戶端使用Smack設(shè)置服務(wù)器地址的函數(shù)有
- setHost:設(shè)置openfire服務(wù)器的hostName
- setHostAddress:設(shè)置openfire地址的ip地址
- setHostnameVerifier:沒用過蚓庭,不贅述
問題描述
由于之前服務(wù)器地址都是hostName的形式,我的XMPPTCPConnectionConfiguration都是以setHost的形式設(shè)置服務(wù)器地址仅仆。但是最近由于內(nèi)網(wǎng)解析的問題器赞,后臺同事把服務(wù)器地址從hostName格式換成IP地址格式。
導(dǎo)致了我的IM模塊一直連不上墓拜,要命的我根本沒有發(fā)現(xiàn)這點港柜。看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緩存出現(xiàn)錯誤咳榜,我們的port從5222改成55222夏醉。然后用wireshark抓包卻發(fā)現(xiàn)根本沒有192.168.0.4:5222
的包,后來仔細看代碼才發(fā)現(xiàn)是hostName和IP地址之間的區(qū)別(看來真的老了老了涌韩,腦闊年老失修啊)畔柔。
解決辦法
判斷平臺返回的openfire服務(wù)器地址是ip地址格式還是hostName格式。下面分享一個判斷IPV4格式地址額函數(shù)
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);
}
如果服務(wù)器返回的IP地址是IPV6格式的話臣樱,將正則表達式改改就可以用了靶擦。
判斷了openfire服務(wù)器地址格式之后,ip地址格式調(diào)用setHostAddress
函數(shù)雇毫,hostName格式調(diào)用setHost
格式即可玄捕。
碼代碼果然要細心啊黑臉