如何获取本机在局域网中的IP地址?
原文地址:https://segmentfault.com/a/1190000007462741
如何获取本机在局域网中的IP地址?
1、ipconfig
(Windows)
2、ifconfig
(Linux)
3、 Java类NetworkInterface
(JDK1.4起始)
如果获得当前机器所有的网络接口(包括物理的和虚拟的),然后筛选出表示局域网的那个网络接口,那就可以得到机器在局域网内的 IP 地址。
先熟悉一下NetworkInterface
NetworkInterface 表示一个网络接口
,可以是一个物理
的网络接口,也可以是一个虚拟
的网络接口,而一个网络接口通常由一个 IP 地址
来表示。
getNetworkInterfaces() 返回当前机器上所有的网络接口
getInetAddresses() 返回绑定到该网卡的所有的 IP 地址(一个网络接口可以绑定多个 IP 地址,通常一个网络接口只对应一个 IP 地址)
// 获得本机的所有网络接口
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
while (nifs.hasMoreElements()) {
NetworkInterface nif = nifs.nextElement();
// 获得与该网络接口绑定的 IP 地址,一般只有一个
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
// 只关心 IPv4 地址
if (addr instanceof Inet4Address) {
System.out.println("网卡接口名称:" + nif.getName());
System.out.println("网卡接口地址:" + addr.getHostAddress());
}
}
}
网卡接口名称:lo
网卡接口地址:127.0.0.1
网卡接口名称:wlan2
网卡接口地址:192.168.137.1 (即为机器在局域网内的 IP 地址)
网卡接口名称:eth10
网卡接口地址:10.10.2.129
Windows 平台上
wlan开头 局域网的网络接口
lo 本地回环地址
eth开头 VMware 创建的虚拟地址
方案1:Windows机器上获得局域网 IP 地址
/**
* Windows 机器上获得局域网 IP 地址
*/
public static InetAddress getLANAddressOnWindows() {
try {
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
while (nifs.hasMoreElements()) {
NetworkInterface nif = nifs.nextElement();
if (nif.getName().startsWith("wlan")) {
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr.getAddress().length == 4) {
// 速度快于 instanceof
return addr;
}
}
}
}
} catch (SocketException ex) {
ex.printStackTrace(System.err);
}
return null;
}
InetAddress lanAddressOnWindows = getLANAddressOnWindows();
System.out.println("网卡接口地址:" + lanAddressOnWindows.getHostAddress());
网卡接口地址:192.168.1.109
(该方法没有考虑 Windows 平台上有多个网络接口的名称以 “wlan” 开头的情况,比如你的机器连接了 WiFi,然后又使用该机器作为热点 —— 不过很容易对二者进行区分,请有兴趣的读者自己实践)
原文链接:https://blog.csdn.net/f641385712/article/details/105233229
方案2:获取本机IP地址(windows or Linux)
错误使用
InetAddress localHost = InetAddress.getLocalHost();
localHost.getHostAddress();
windows 192.168.199.175
windows开一个vpn 2.0.0.137
windows网卡接口 此方法就不好使了
Linux 127.0.0.1
/etc/hosts的第一行一般均是:127.0.0.1 localhost,所以返回值是127.0.0.1
倘若你把第一行改为127.1.1.1 localhost,那么它的返回值就是127.1.1.1了
推荐方案
此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK
/**
* 获取本机IP地址
*/
public static InetAddress getLocalHostAddress() {
try {
InetAddress candidateAddress = null;
// 获得本机的所有网络接口
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface nif = networkInterfaces.nextElement();
// 获得与该网络接口绑定的IP地址,一般只有一个
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress inetAddr = addresses.nextElement();
// 排除loopback环回类型地址(不管是IPv4还是IPv6 只要是回环地址都会返回true)
if (!inetAddr.isLoopbackAddress()) {
if (inetAddr.isSiteLocalAddress()) {
// 如果是site-local地址,就是它了 就是我们要找的
// ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~
return inetAddr;
}
// 若不是site-local地址 那就记录下该地址当作候选
if (candidateAddress == null) {
candidateAddress = inetAddr;
}
}
}
}
// 如果除了环回地之外无其它地址了,那就回退到原始方案吧
return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
InetAddress localHostAddress = getLocalHostAddress();
System.out.println("网卡接口地址:" + localHostAddress.getHostAddress());
网卡接口地址:192.168.1.109
还没有评论,来说两句吧...