目录
Java原生API:
你可以使用:NetworkInterface获取计算上的网络接口信息(下图全部遍历网路接口)
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
// if (!address.isLoopbackAddress() && address.isSiteLocalAddress()) {
console.info(networkInterface.getInterfaceAddresses());
console.Info(networkInterface.getInterfaceAddresses());
// }
}
}
对比
这样的获取方式,不一定精确的,影响因素有几点:
权限:在某些操作系统中,获取网络接口的信息可能需要特殊的权限。如果没有这些权限,可能无法获取全部的网络接口信息。
虚拟和隐藏的网络接口:有些系统可能有虚拟的网络接口或者隐藏的网络接口,这些接口可能不会被
NetworkInterface.getNetworkInterfaces()
返回。Java的安全策略:如果你的 Java 程序运行在一个有安全管理器的环境中,那么可能需要
NetPermission("getNetworkInformation")
权限才能获取网络接口信息。否则,NetworkInterface.getNetworkInterfaces()
可能只会返回一个空的Enumeration
。网络接口状态:如果网络接口处于不活跃的状态,例如未连接到网络,那么这些接口可能不会被
NetworkInterface.getNetworkInterfaces()
返回。
C++原生方式开始获取
于是我从Windows操作系统提供的数据API上开始获取并且写成Java插件
并且写完时在Java中提供了这些过滤方式-应对全部网卡(亲测有效)(JDK19 x64)
ip_if_filter:引用自ipifcons.h
family:引用自ws2def.h
可与我上次写的JNAudio文字转语音插件(免费x64)混装在一起
使用该插件得出的全部网卡的一些数据,你可以试着使用过滤方式去分别wifi和以太网
的信息,过滤方式的常量引用的ipifcons.h AND ws2def.h可以直接百度.
资源下载
colorful1.2框架
因为这些框架是集合在colorful1.2分离式的模块化插件,所以你需要先安装colorful1.2框架
框架安装教程/使用教程,后面我会打算专门分离colorful1.2一些模块,制作成一些独立的插件
教程
基本实例化
//需要先导入这个插件dll库的位置
System.load("Net_Work_Route.dll");
//实例Java对象
net_work C=new net_work();
//C++ 将 net_work绑定到Java实例对象
C.initModel();
//C.方法
//解绑/释放/释放后将无法使用net_work中的任何方法,需要重新initModel
C.release_network();
使用方法列表
initModel | 在插件中将C++的方法/class/其他引用绑定到Java实例化对象 你可以把它当成初始方法,需要使用 release_network(解除绑定)释放 |
getLocalAdapter | 获取本地全部网卡适配器名称,获取后你可以依据这些名称获取关于它的一些信息比如:IP4地址返回(List<String>) |
getAdapterAddress | 参数String,适配器名称,你可以使用 ws2def.adapter_null获取全部网卡适配器对话的IP4返回List<String> |
getSubnetMask | 参数String,适配器名称,你可以使用 ws2def.adapter_null获取全部网卡适配器对话的子网掩码返回List<String> |
getLocalHostIP4 | 参数int,你需要配合 ip_if_filter.*过滤wifi/以太网的/默认网关/其他ip,为ip_if_filter.NULL全部网卡适配器所有IP返回List<String> |
getLocalHostMac | 参数int,你需要配合 ip_if_filter.*过滤wifi/以太网的/默认网关/其他MAC,为ip_if_filter.NULL全部网卡适配器所有MAC返回List<String> |
getLocalHostIP6 | 参数int,你需要配合 ws2def.*过滤wifi/以太网的/默认网关/其他IP6,(全部网卡),返回List<String> |
getDeviceInfo | 主机地址类型:0 地址清单:1 别名:2 地址长度:3 正式的主机名:4 返回List<String> |
getDeviceName | 返回当前设备当前系统的名称 返回String |
release_network | (解除绑定)释放,你将无法使用/无法找到绑定的Class/函数/其他引用,使用之后再次调用其他方法 将会返回NULL,不会引发错误,你要使用initModel重新绑定 |
getWebStormInfo | 通过一条有效IP/域名通过网路获取web主机信息 主机地址类型:0 地址清单:1 别名:2 地址长度:3 正式的主机名:4 返回List<String> 多次尝试后可能被对方拒绝返回Null |
get_gateway | 获取当前默认网关IP |
简单的一小段尝试
System.load("Net_Work_Route.dll路径");
net_work C=new net_work();
C.initModel();
List<String> ip_if=C.getAdapterAddress(ws2def.adapter_null);
console.info(ip_if);
List<String> device = C.getDeviceInfo();
console.info("""
主机地址类型:%s
地址清单:%s
别名:%s
地址长度:%s
正式的主机名:%s""".formatted(device.get(0), device.get(1), device.get(2), device.get(3), device.get(4)));
List<String> adapter = C.getLocalAdapter(ip_if_filter.NULL);
console.info("全部网卡适配器::%s".formatted(adapter.toString()));
console.info("当前默认IP转发表默认网关:%s".formatted(C.get_gateway()));
console.info("当前全部网卡转发的的IP:%s".formatted(C.getLocalHostIP4(ip_if_filter.NULL)));
console.info("当前全部网卡适配器全部IP:%s".formatted(C.getAdapterAddress(ws2def.adapter_null)));
console.info("当前全部网卡适配器子网掩码:%s".formatted(C.getSubnetMask(ws2def.adapter_null)));
console.info("当前全部网卡适配器UDP, TCP, etc转发对象:%s".formatted(C.getLocalHostIP4(ws2def.AF_INET)));
C.release_network();