我们需要一种从给定范围生成随机 IPv4 地址的方法。无法设置范围。我的谷歌搜索使我发现您可以使用该类来存储地址Inet4Address,但是:
- 根据文档,这个类的实例是用一个
getByName可以抛出异常的方法实例化的UnknownHostException; - 也就是说,问题在于,这个方法是一把瑞士刀,可以将经典的视图字符串
192.168.0.1变成所需的对象,或者如果通过了就进行DNS名称解析domain.com。并且在解决的情况下,据我了解,可能会发生上述异常; - 我想以经典方式设置地址范围,而无需进行 DNS 解析。那些。我确定
UnknownHostException不会发生异常,但我必须绝对处理它。
使用此选项,我的代码结果如下:
import com.sun.tools.javac.util.Pair;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
class IPRanges {
static final ArrayList<Pair<InetAddress, InetAddress>> IPv4GlobalRanges = new ArrayList<Pair<InetAddress, InetAddress>>() {{
try {
add(new Pair<>(InetAddress.getByName("1.0.0.0"), InetAddress.getByName("9.255.255.255")));
add(new Pair<>(InetAddress.getByName("11.0.0.0"), InetAddress.getByName("100.63.255.255")));
add(new Pair<>(InetAddress.getByName("100.128.0.0"), InetAddress.getByName("126.255.255.255")));
add(new Pair<>(InetAddress.getByName("128.0.0.0"), InetAddress.getByName("169.253.255.255")));
add(new Pair<>(InetAddress.getByName("169.255.0.0"), InetAddress.getByName("172.15.255.255")));
add(new Pair<>(InetAddress.getByName("172.32.0.0"), InetAddress.getByName("191.255.255.255")));
add(new Pair<>(InetAddress.getByName("192.0.1.0"), InetAddress.getByName("192.0.1.255")));
add(new Pair<>(InetAddress.getByName("192.0.3.0"), InetAddress.getByName("192.167.255.255")));
add(new Pair<>(InetAddress.getByName("192.169.0.0"), InetAddress.getByName("198.17.255.255")));
add(new Pair<>(InetAddress.getByName("198.20.0.0"), InetAddress.getByName("198.51.99.255")));
add(new Pair<>(InetAddress.getByName("198.51.101.0"), InetAddress.getByName("203.0.112.255")));
add(new Pair<>(InetAddress.getByName("203.0.114.0"), InetAddress.getByName("223.255.255.255")));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}};
}
我不确定这是否是“正确”的做法,我不喜欢这样:
- 填充范围必须通过 完成
try ... catch,尽管我知道那里肯定不会出现异常; - 您需要一定范围的 IPv4 地址。如果您将结果显式
InetAddress转换为Inet4Address,那么您将获得更大的代码表。
此外,所有构造函数Inet4Address都是私有的,这会阻止它们被直接调用(在我的情况下,这将解决问题)。
如何“正确”解决问题(具体来说,实例化一个描述 IPv4 地址的类的实例,而无需进行不必要的异常处理)?它不一定是Inet4Address,但我希望它是内置的,这样就没有不必要的依赖。
最后,我想出了这个:
那些。:
Inet4Address。catch块中,我将其替换e.printStackTrace();为throw new AssertionError(e);, 因为。我在英语 SO 上找到了一个答案,它说你AssertionError应该在那些不会发生异常的地方抛出。我可以建议您设置 IPv4 范围,而不是使用 Inet4Address 类,而是使用地址的位表示。因此,要设置范围,我们需要两个 int 数字或一个 long 数字。
转换算法: https ://habr.com/ru/post/679008/