如何获取本机在局域网中的IP地址?

男娘i 2024-03-24 19:37 178阅读 0赞

原文地址:https://segmentfault.com/a/1190000007462741


如何获取本机在局域网中的IP地址?

1、ipconfig (Windows)
2、ifconfig (Linux)
3、 Java类NetworkInterface (JDK1.4起始)
如果获得当前机器所有的网络接口(包括物理的和虚拟的),然后筛选出表示局域网的那个网络接口,那就可以得到机器在局域网内的 IP 地址。


先熟悉一下NetworkInterface

NetworkInterface 表示一个网络接口,可以是一个物理的网络接口,也可以是一个虚拟的网络接口,而一个网络接口通常由一个 IP 地址来表示。

  1. getNetworkInterfaces() 返回当前机器上所有的网络接口
  2. getInetAddresses() 返回绑定到该网卡的所有的 IP 地址(一个网络接口可以绑定多个 IP 地址,通常一个网络接口只对应一个 IP 地址)
  3. // 获得本机的所有网络接口
  4. Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
  5. while (nifs.hasMoreElements()) {
  6. NetworkInterface nif = nifs.nextElement();
  7. // 获得与该网络接口绑定的 IP 地址,一般只有一个
  8. Enumeration<InetAddress> addresses = nif.getInetAddresses();
  9. while (addresses.hasMoreElements()) {
  10. InetAddress addr = addresses.nextElement();
  11. // 只关心 IPv4 地址
  12. if (addr instanceof Inet4Address) {
  13. System.out.println("网卡接口名称:" + nif.getName());
  14. System.out.println("网卡接口地址:" + addr.getHostAddress());
  15. }
  16. }
  17. }
  18. 网卡接口名称:lo
  19. 网卡接口地址:127.0.0.1
  20. 网卡接口名称:wlan2
  21. 网卡接口地址:192.168.137.1 (即为机器在局域网内的 IP 地址)
  22. 网卡接口名称:eth10
  23. 网卡接口地址:10.10.2.129
  24. Windows 平台上
  25. wlan开头 局域网的网络接口
  26. lo 本地回环地址
  27. eth开头 VMware 创建的虚拟地址

方案1:Windows机器上获得局域网 IP 地址

  1. /**
  2. * Windows 机器上获得局域网 IP 地址
  3. */
  4. public static InetAddress getLANAddressOnWindows() {
  5. try {
  6. Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
  7. while (nifs.hasMoreElements()) {
  8. NetworkInterface nif = nifs.nextElement();
  9. if (nif.getName().startsWith("wlan")) {
  10. Enumeration<InetAddress> addresses = nif.getInetAddresses();
  11. while (addresses.hasMoreElements()) {
  12. InetAddress addr = addresses.nextElement();
  13. if (addr.getAddress().length == 4) {
  14. // 速度快于 instanceof
  15. return addr;
  16. }
  17. }
  18. }
  19. }
  20. } catch (SocketException ex) {
  21. ex.printStackTrace(System.err);
  22. }
  23. return null;
  24. }
  25. InetAddress lanAddressOnWindows = getLANAddressOnWindows();
  26. System.out.println("网卡接口地址:" + lanAddressOnWindows.getHostAddress());
  27. 网卡接口地址:192.168.1.109

(该方法没有考虑 Windows 平台上有多个网络接口的名称以 “wlan” 开头的情况,比如你的机器连接了 WiFi,然后又使用该机器作为热点 —— 不过很容易对二者进行区分,请有兴趣的读者自己实践)


原文链接:https://blog.csdn.net/f641385712/article/details/105233229

方案2:获取本机IP地址(windows or Linux)

错误使用

  1. InetAddress localHost = InetAddress.getLocalHost();
  2. localHost.getHostAddress();
  3. windows 192.168.199.175
  4. windows开一个vpn 2.0.0.137
  5. windows网卡接口 此方法就不好使了
  6. Linux 127.0.0.1
  7. /etc/hosts的第一行一般均是:127.0.0.1 localhost,所以返回值是127.0.0.1
  8. 倘若你把第一行改为127.1.1.1 localhost,那么它的返回值就是127.1.1.1

推荐方案
此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK

  1. /**
  2. * 获取本机IP地址
  3. */
  4. public static InetAddress getLocalHostAddress() {
  5. try {
  6. InetAddress candidateAddress = null;
  7. // 获得本机的所有网络接口
  8. Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
  9. while (networkInterfaces.hasMoreElements()) {
  10. NetworkInterface nif = networkInterfaces.nextElement();
  11. // 获得与该网络接口绑定的IP地址,一般只有一个
  12. Enumeration<InetAddress> addresses = nif.getInetAddresses();
  13. while (addresses.hasMoreElements()) {
  14. InetAddress inetAddr = addresses.nextElement();
  15. // 排除loopback环回类型地址(不管是IPv4还是IPv6 只要是回环地址都会返回true)
  16. if (!inetAddr.isLoopbackAddress()) {
  17. if (inetAddr.isSiteLocalAddress()) {
  18. // 如果是site-local地址,就是它了 就是我们要找的
  19. // ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~
  20. return inetAddr;
  21. }
  22. // 若不是site-local地址 那就记录下该地址当作候选
  23. if (candidateAddress == null) {
  24. candidateAddress = inetAddr;
  25. }
  26. }
  27. }
  28. }
  29. // 如果除了环回地之外无其它地址了,那就回退到原始方案吧
  30. return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress;
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. return null;
  35. }
  36. InetAddress localHostAddress = getLocalHostAddress();
  37. System.out.println("网卡接口地址:" + localHostAddress.getHostAddress());
  38. 网卡接口地址:192.168.1.109

发表评论

表情:
评论列表 (有 0 条评论,178人围观)

还没有评论,来说两句吧...

相关阅读