运行结果
--------------START--------------
FAILRE - CAN not connect! Local:127.0.0.1remote:10.8.1.50port22
FAILRE - CAN not connect! Local:9.123.231.40remote:10.8.1.50port22
SUCCESS - connection established! Local:10.0.50.189remote:10.8.1.50port22
Reachable local IP is found, it is10.0.50.189
--------------END--------------
IPv4和IPv6混合网络下编程
当网络环境中存在IPv4和IPv6,即机器既有IPv4地址,又有IPv6地址的时候,我们可以对程序进行一些优化,比如
● 由于IPv4和IPv6地址之间是无法互相访问的,因此仅需要判断IPv4地址之间和IPv6地址之间的可达性。
● 对于IPv4的换回地址可以不做判断,对于IPv6的Linklocal地址也可以跳过测试
● 根据实际的需要,我们可以优先考虑选择使用IPv4或者IPv6,提高判断的效率
程序清单3:判断本地地址和远程地址是否同为IPv4或者IPv6
// 判断是 IPv4 还是 IPv6
if(!((localInetAddr instanceofInet4Address) && (remoteInetAddr instanceofInet4Address)
|| (localInetAddr instanceofInet6Address) && (remoteInetAddr instanceofInet6Address))){
// 本地和远程不是同时是 IPv4 或者 IPv6,跳过这种情况,不作检测
break;
}
程序清单4:跳过本地地址和LinkLocal地址
if( localAddr.isLoopbackAddress() ||
localAddr.isAnyLocalAddress() ||
localAddr.isLinkLocalAddress() ){
// 地址为本地环回地址,跳过
break;
}
总结和展望
本文列举集中典型的场景,介绍了通过Java网络编程接口判断机器之间可达性的几种方式。在实际应用中,可以根据不同的需要选择相应的方法稍加修改即可。对于更加特殊的需求,还可以考虑通过JNI的方法直接调用系统API来实现,能提供更加强大和灵活的功能,这里就不再赘述了。
44/4<1234