InetAddress.getLocalHost()详解及异常处理

//return the raw IP address in a string format
InetAddress.getLocalHost().getHostAddress();
//return the raw IP address of this object
InetAddress.getLocalHost().getAddress();

本机的一个运行结果:

192.168.1.104
[B@14318bb

InetAddress.getLocalHost()异常处理:

使用:InetAddress.getLocalHost() 出现异常:
“Reason: java.net.UnknownHostException zw_65_43 : …..

问题原因是在系统的 /etc/Hostname中配置了“zw_65_43” 作为主机名,
而在/etc/hosts文件中没有 相应的“zw_65_43”。
简单的解决办法是对应关系配好就可以,甚至删除/etc/Hostname这个文件也可以。

深层的原因: 在大多数Linux操作系统中,都是以/etc/hosts中的配置查找主机名的,
但是 Detian based system 用/etc/Hostname文件中的配置做主机名。
而Java 的InetAddress.java 调用 InetAddressImpl.java 的
public native String getLocalHostName() throws UnknownHostException; 来获取本地主机名,
Java 的这个方法是native的,是本地系统的一个实现,所以在本地配置出现问题的情况下,Java 代码出现问题。

依靠本机的机器名去查询IP 地址,和 ping hostname 返回的 IP 地址是同一个,并不是 ipconfig 方法得到的 eth0 IP 地址.

hostname 查看本机名称

a. 若本机名称不是一个IP地址, 比如是”sohu”,则必须在/etc/hosts中配置 sohu对应本机IP,
否则java.net.InetAddress.getLocalHost会抛出java.net.UnknownHostException异常.

b. 若本机名称是一个IP地址,而且必须是本机某块网卡的IP,

c. 第三种情况比较麻烦。倘若本机名称是一个IP地址,但不是本机某块网卡的IP,或者只是某个IP地址的一部分,
比如192.168(这是我遇到过的),那么执行java.net.InetAddress.getLocalHost().getHostAddress()会得到192.0.0.168,
java.net.InetAddress.getLocalHost().getHostAddress()不会抛出异常,但相关访问会停滞很久,
原因是他在查找192.0.0.168这个地址, 若网络中不存在这个地址,最终会抛出Connection timed out异常;
若网络中存在这个地址,Connection refused to host这个异常将被抛出,这些显然都不是想要的

结论:

  1. 设置本机名称:hostname mName xxx最好不是写IP地址的形式,若写则必须是本机的完全IP形式(不要只写一半)
  2. 在/etc/hosts里加一行 本机IP mName
  3. 用InetAddress.getLocalHost().getHostAddress()测试一下结果是否是与本机IP一致
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
InetAddress 类是 Java 中表示 IP 地址的类,它提供了一组静态方法来获取本地主机的 IP 地址和域名以及其他主机的 IP 地址和域名。InetAddress 类可以表示 IPv4 地址和 IPv6 地址。 InetAddress 类的常用方法: 1. `getByName(String host)`:根据主机名或 IP 地址字符串获取 InetAddress 对象。 2. `getLocalHost()`:获取本地主机地址。 3. `getHostName()`:获取主机名。 4. `getHostAddress()`:获取 IP 地址。 5. `isReachable(int timeout)`:测试是否可以到达该地址。 6. `equals(Object obj)`:判断两个 InetAddress 对象是否相等。 7. `toString()`:返回 InetAddress 对象的字符串表示形式。 下面是一个使用 InetAddress 类的示例: ```java import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressExample { public static void main(String[] args) { try { // 获取本机的 InetAddress 对象 InetAddress localHost = InetAddress.getLocalHost(); System.out.println("本机名:" + localHost.getHostName()); System.out.println("本机 IP 地址:" + localHost.getHostAddress()); // 根据主机名获取 InetAddress 对象 InetAddress baidu = InetAddress.getByName("www.baidu.com"); System.out.println("百度 IP 地址:" + baidu.getHostAddress()); // 测试是否可以到达该地址 boolean reachable = baidu.isReachable(5000); System.out.println("是否可达:" + reachable); } catch (UnknownHostException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } ``` 输出结果: ``` 本机名:DESKTOP-XXXXXX 本机 IP 地址:192.168.0.100 百度 IP 地址:39.156.69.79 是否可达:true ``` 以上示例中,首先使用 InetAddress 类的 `getLocalHost()` 方法获取本机的 InetAddress 对象,然后使用 `getHostName()` 和 `getHostAddress()` 方法分别获取主机名和 IP 地址。 接着使用 `getByName(String host)` 方法根据主机名获取 InetAddress 对象,并使用 `getHostAddress()` 方法获取 IP 地址。 最后使用 `isReachable(int timeout)` 方法测试是否可以到达该地址。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值