java 获取ipv4的地址_java 获取ip地址和网络接口

网络相关对象在java.net包中。

1.获取主机对象InetAddress

//获取本地主机对象

InetAddress host = InetAddress.getLocalHost();

//根据ip地址或主机名获取主机对象,以主机名获取主机时需要DNS解析

InetAddress host = InetAddress.getByName("192.168.100.124");

InetAddress host = InetAddress.getByName("www.baidu.com");

2.获取主机对象的ip地址和主机名(需要dns解析主机名)

host.getHostAddress();

host.getHostName();

3.获取本机所有接口NetworkInterface并遍历

//返回数据类型为Enumeration

Enumeration enu = NetworkInterface.getNetworkInterfaces();

while(enu.hasMoreElements){

NetworkInterface inet = enu.nextElement();

String intName = inet.getName();

}

由于一个接口上可能有多个子接口(辅助ip,如eth0:1),因此根据某个接口,可以得到该接口的所有ip地址枚举集合(同时包括Ipv4和ipv6接口)。

Enumeration net_list = inet.getInetAddresses();

while(net_list.hasMoreElements){

InetAddress net = net_list.nextElement();

String ip = net.getHostAddress();

}

可以使用Collections.list()方法将Enumeration类型转换为ArrayList集合的数据结构,然后使用Itreator遍历器遍历。

以下是获取本机所有接口名称和这些接口上的ipv4地址的方法(适用于Windows和Linux)。

import java.net.*;

import java.util.*;

public class EnumDemo{

public static void main(String[] args) {

try {

//获取所有接口,并放进枚举集合中,然后使用Collections.list()将枚举集合转换为ArrayList集合

Enumeration enu = NetworkInterface.getNetworkInterfaces();

ArrayList arr = Collections.list(enu);

for(Iterator it = arr.iterator();it.hasNext();) {

NetworkInterface ni = it.next();

String intName = ni.getName(); //获取接口名

//获取每个接口中的所有ip网络接口集合,因为可能有子接口

ArrayList inets = Collections.list(ni.getInetAddresses());

for(Iterator it1 = inets.iterator();it1.hasNext();) {

InetAddress inet = it1.next();

//只筛选ipv4地址,否则会同时得到Ipv6地址

if(inet instanceof Inet4Address) {

String ip = inet.getHostAddress();

System.out.printf("%-10s %-5s %-6s %-15s\n", "InetfaceName:",intName,"| IPv4:",ip);

}

}

}

} catch (SocketException s) {

s.printStackTrace();

}

}

}

注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用位运算来实现获取所有 IP 的功能。假设给出的 IPv4 地址为 A.B.C.D,掩码位为 N,则可以先将 A、B、C、D 转换为二进制,然后将前 N 位不变,后面的所有位都设置为 0,得到网络地址。然后将后面的所有位都设置为 1,得到广播地址。然后遍历从网络地址+1 到广播地址-1 的所有地址,即为该子网内的所有 IP。 以下是一个 Java 实现示例: ```java public static List<String> getAllIP(String ipv4, int mask) { List<String> result = new ArrayList<>(); try { // 将 IPv4 地址转换为二进制数组 String[] ipv4Arr = ipv4.split("\\."); byte[] ipv4Bytes = new byte[4]; for (int i = 0; i < 4; i++) { ipv4Bytes[i] = (byte) Integer.parseInt(ipv4Arr[i]); } // 将掩码位转换为二进制数组 byte[] maskBytes = new byte[4]; Arrays.fill(maskBytes, (byte) 0xFF); for (int i = 0; i < mask; i++) { int index = i / 8; int bit = i % 8; maskBytes[index] &= ~(1 << (7 - bit)); } // 计算网络地址和广播地址 byte[] networkBytes = new byte[4]; byte[] broadcastBytes = new byte[4]; for (int i = 0; i < 4; i++) { networkBytes[i] = (byte) (ipv4Bytes[i] & maskBytes[i]); broadcastBytes[i] = (byte) (ipv4Bytes[i] | ~maskBytes[i]); } // 遍历所有地址 for (long i = toLong(networkBytes) + 1; i < toLong(broadcastBytes); i++) { result.add(toString(toBytes(i))); } } catch (Exception e) { e.printStackTrace(); } return result; } private static long toLong(byte[] bytes) { long result = 0; for (int i = 0; i < 4; i++) { result = (result << 8) | (bytes[i] & 0xFF); } return result; } private static byte[] toBytes(long value) { byte[] result = new byte[4]; for (int i = 3; i >= 0; i--) { result[i] = (byte) (value & 0xFF); value >>= 8; } return result; } private static String toString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { sb.append(bytes[i] & 0xFF); if (i < 3) { sb.append("."); } } return sb.toString(); } ``` 使用示例如下: ```java List<String> ips = getAllIP("192.168.0.1", 24); for (String ip : ips) { System.out.println(ip); } ``` 输出结果为: ``` 192.168.0.2 192.168.0.3 192.168.0.4 ... 192.168.0.253 192.168.0.254 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值