Home> Java> javaTutorial> body text

How to write the code to obtain the local IP address in Java

王林
Release: 2023-05-28 08:36:43
forward
2102 people have browsed it

Preface

How to accurately obtain the local IP address in Java? Most of the methods on the Internet areInetAddress.getLocalHost().getHostAddress(). This can indeed obtain the local IP address, but it is inaccurate. Because one problem has been ignored, the network environment is changeable. Different network cards on a computer have multiple IP addresses, such as Lan, WiFi, Bluetooth, hotspots, virtual machine network cards, etc.

1. Rules

  • 127.xxx.xxx.xxx belongs to the "loopback" address, that is, it can only be seen by your own machine. It is the address of this machine. Compare Common ones are 127.0.0.1

  • 192.168.xxx.xxx, which belongs to the private private address (site local address) and is accessible within the local organization and can only be seen on the local LAN

  • Similarly, 10.xxx.xxx.xxx, from 172.16.xxx.xxx to 172.31.xxx.xxx are all private addresses and belong to internal access of the organization

  • 169.254.xxx.xxx belongs to the link local IP and is available in a single network segment.

  • From 224.xxx.xxx.xxx to 239.xxx.xxx.xxx belongs to the group Broadcast address

  • The special 255.255.255.255 belongs to the broadcast address

  • The other addresses are point-to-point available public IPv4 addresses

2. Obtain

1.Use

public static void main(String[] args) throws SocketException { System.out.println( IpUtil.getLocalIp4Address().get().toString().replaceAll("/","")); }
Copy after login

2.Tool class

package com.dingwen.test.utils; import org.springframework.util.ObjectUtils; import java.net.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Optional; /** * 获取本机IP 地址 * * @author dingwen * 2021.04.28 11:49 */ public class IpUtil { /* * 获取本机所有网卡信息 得到所有IP信息 * @return Inet4Address> */ public static List getLocalIp4AddressFromNetworkInterface() throws SocketException { List addresses = new ArrayList<>(1); // 所有网络接口信息 Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); if (ObjectUtils.isEmpty(networkInterfaces)) { return addresses; } while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces.nextElement(); //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头 if (!isValidInterface(networkInterface)) { continue; } // 所有网络接口的IP地址信息 Enumeration inetAddresses = networkInterface.getInetAddresses(); while (inetAddresses.hasMoreElements()) { InetAddress inetAddress = inetAddresses.nextElement(); // 判断是否是IPv4,并且内网地址并过滤回环地址. if (isValidAddress(inetAddress)) { addresses.add((Inet4Address) inetAddress); } } } return addresses; } /** * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头 * * @param ni 网卡 * @return 如果满足要求则true,否则false */ private static boolean isValidInterface(NetworkInterface ni) throws SocketException { return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual() && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens")); } /** * 判断是否是IPv4,并且内网地址并过滤回环地址. */ private static boolean isValidAddress(InetAddress address) { return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress(); } /* * 通过Socket 唯一确定一个IP * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的 * @return Inet4Address> */ private static Optional getIpBySocket() throws SocketException { try (final DatagramSocket socket = new DatagramSocket()) { socket.connect(InetAddress.getByName("8.8.8.8"), 10002); if (socket.getLocalAddress() instanceof Inet4Address) { return Optional.of((Inet4Address) socket.getLocalAddress()); } } catch (UnknownHostException networkInterfaces) { throw new RuntimeException(networkInterfaces); } return Optional.empty(); } /* * 获取本地IPv4地址 * @return Inet4Address> */ public static Optional getLocalIp4Address() throws SocketException { final List inet4Addresses = getLocalIp4AddressFromNetworkInterface(); if (inet4Addresses.size() != 1) { final Optional ipBySocketOpt = getIpBySocket(); if (ipBySocketOpt.isPresent()) { return ipBySocketOpt; } else { return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0)); } } return Optional.of(inet4Addresses.get(0)); } }
Copy after login

Reference:

https ://www.jianshu.com/p/f619663f0f0a

https://www.cnblogs.com/starcrm/p/7071227.html

The following is a piece of Java to get the local IP Example code for address

import java.net.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Objects; import java.util.Optional; /** * 获取本机IP 地址 */ public class IpUtil { /* * 获取本机所有网卡信息 得到所有IP信息 * @return Inet4Address> */ public static List getLocalIp4AddressFromNetworkInterface() throws SocketException { List addresses = new ArrayList<>(1); // 所有网络接口信息 Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); if (Objects.isNull(networkInterfaces)) { return addresses; } while (networkInterfaces.hasMoreElements()) { NetworkInterface networkInterface = networkInterfaces.nextElement(); //滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头 if (!isValidInterface(networkInterface)) { continue; } // 所有网络接口的IP地址信息 Enumeration inetAddresses = networkInterface.getInetAddresses(); while (inetAddresses.hasMoreElements()) { InetAddress inetAddress = inetAddresses.nextElement(); // 判断是否是IPv4,并且内网地址并过滤回环地址. if (isValidAddress(inetAddress)) { addresses.add((Inet4Address) inetAddress); } } } return addresses; } /** * 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头 * * @param ni 网卡 * @return 如果满足要求则true,否则false */ private static boolean isValidInterface(NetworkInterface ni) throws SocketException { return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual() && (ni.getName().startsWith("eth") || ni.getName().startsWith("ens")); } /** * 判断是否是IPv4,并且内网地址并过滤回环地址. */ private static boolean isValidAddress(InetAddress address) { return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress(); } /* * 通过Socket 唯一确定一个IP * 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的 * @return Inet4Address> */ private static Optional getIpBySocket() throws SocketException { try (final DatagramSocket socket = new DatagramSocket()) { socket.connect(InetAddress.getByName("8.8.8.8"), 10002); if (socket.getLocalAddress() instanceof Inet4Address) { return Optional.of((Inet4Address) socket.getLocalAddress()); } } catch (UnknownHostException networkInterfaces) { throw new RuntimeException(networkInterfaces); } return Optional.empty(); } /* * 获取本地IPv4地址 * @return Inet4Address> */ public static Optional getLocalIp4Address() throws SocketException { final List inet4Addresses = getLocalIp4AddressFromNetworkInterface(); if (inet4Addresses.size() != 1) { final Optional ipBySocketOpt = getIpBySocket(); if (ipBySocketOpt.isPresent()) { return ipBySocketOpt; } else { return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0)); } } return Optional.of(inet4Addresses.get(0)); } }
Copy after login

The above is the detailed content of How to write the code to obtain the local IP address in Java. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:yisu.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!