Android Java中InetAddress返回带前缀斜杠的IP 无法正常获取主机名问题咨询
1. 开头斜杠的成因
这个斜杠没有被写入IP地址的实际值,完全是InetAddress类默认toString()方法的输出格式导致:InetAddress的toString固定返回「主机名/IP地址」的拼接结果,当IP还未完成反向解析、没有对应主机名时,主机名部分为空,最终输出就会显示为/xxx.xxx.xxx.xxx的样式,仅属于展示层面的格式差异,不会影响InetAddress对象的实际功能。
2. 问题解决方法
2.1 去除斜杠获取纯IP
如果需要不带斜杠的纯IP字符串,不要直接调用InetAddress对象的toString(),调用getHostAddress()方法即可,该方法原生返回无额外格式的纯IP文本。
示例代码:
InetAddress inetAddr = InetAddress.getByName("目标设备IP"); // 返回不带斜杠的纯IP String pureIp = inetAddr.getHostAddress();
2.2 无法获取预期主机名的排查方案
拿不到主机名和斜杠没有任何关联,可按以下顺序排查问题:
- 确认已在AndroidManifest中添加
INTERNET、ACCESS_NETWORK_STATE权限,缺少权限会直接导致解析失败 - 确认网络操作已放在子线程执行(你改用AsyncTask的操作是正确的,网络类操作禁止在主线程运行)
- 如果使用
getByAddress方法,确认传入的IP字节数组格式正确:IPv4地址需转换为长度为4的字节数组,对应IP的四个分段,不要直接将IP字符串的字符编码转为字节数组,否则会导致地址无效无法解析 - 如果查询的是本地热点连接的设备,可先读取系统ARP表验证对应IP是否有主机名记录,ARP表路径为
/proc/net/arp - 部分嵌入式设备本身禁用了反向DNS查询响应,你可以改用
getCanonicalHostName()方法替代getHostName()尝试获取主机名,该方法会优先触发全限定域名解析,适配部分局域网设备的解析规则
内容的提问来源于stack exchange,提问作者Luigino
相关产品推荐
相关产品推荐

