获取本机外网IP地址
通过Java获取本地机器外网的IP地址,不借助系统命令ServerHost.javapackage org.shuochen.test.network;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* Helper class the get the external net IP address
*/
public class ServerHost {
/**
* Singleton instance
*/
private static final ServerHost instance = new ServerHost();
/**
* Access Control
*/
private ServerHost(){};
/**
* @return instance
*/
public static ServerHost getInstance() {
return instance;
}
public String getExtranetIPv4Address(){
return searchNetworkInterfaces(IPAcceptFilterFactory.getIPv4AcceptFilter());
}
public String getExtranetIPv6Address(){
return searchNetworkInterfaces(IPAcceptFilterFactory.getIPv6AcceptFilter());
}
public String getExtranetIPAddress(){
return searchNetworkInterfaces(IPAcceptFilterFactory.getIPAllAcceptFilter());
}
private String searchNetworkInterfaces(IPAcceptFilter ipFilter){
try {
Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
while (enumeration.hasMoreElements()) {
NetworkInterface networkInterface = enumeration.nextElement();
//Ignore Loop/virtual/Non-started network interface
if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
continue;
}
Enumeration<InetAddress> addressEnumeration = networkInterface.getInetAddresses();
while (addressEnumeration.hasMoreElements()) {
InetAddress inetAddress = addressEnumeration.nextElement();
String address = inetAddress.getHostAddress();
if(ipFilter.accept(address)){
return address;
}
}
}
} catch (SocketException e) {
//consider log for this exception
}
return "";
}
}IPAcceptFilterFactory.javapackage org.shuochen.test.network;
public class IPAcceptFilterFactory {
public static IPAcceptFilter getIPAllAcceptFilter(){
return IPAllAcceptFilter.getInstance();
}
public static IPAcceptFilter getIPv4AcceptFilter(){
return IPv4AcceptFilter.getInstance();
}
public static IPAcceptFilter getIPv6AcceptFilter(){
return IPv6AcceptFilter.getInstance();
}
}IPAcceptFilter.javapackage org.shuochen.test.network;
/**
* Consider @FunctionalInterface for JDK8
*
*/
public interface IPAcceptFilter {
public String IPv6KeyWord = ":";
public boolean accept(String ipAddress);
}IPAllAcceptFilter.javapackage org.shuochen.test.network;
public class IPAllAcceptFilter implements IPAcceptFilter{
private static IPAcceptFilter instance = null;
/**
* Access Control
*/
private IPAllAcceptFilter(){};
/**
* Ignore multiple thread sync problem in extreme case
*/
public static IPAcceptFilter getInstance(){
if(instance == null){
instance = new IPAllAcceptFilter();
}
return instance;
}
@Override
public boolean accept(String ipAddress) {
return true;
}
}IPv4AcceptFilter.javapackage org.shuochen.test.network;
public class IPv4AcceptFilter implements IPAcceptFilter{
private static IPAcceptFilter instance = null;
/**
* Access Control
*/
private IPv4AcceptFilter(){};
/**
* Ignore multiple thread sync problem in extreme case
*/
public static IPAcceptFilter getInstance(){
if(instance == null){
instance = new IPv4AcceptFilter();
}
return instance;
}
@Override
public boolean accept(String ipAddress) {
return ipAddress != null && ipAddress.indexOf(IPv6KeyWord) == -1;
}
}IPv6AcceptFilter.javapackage org.shuochen.test.network;
public class IPv6AcceptFilter implements IPAcceptFilter{
private static IPAcceptFilter instance = null;
/**
* Access Control
*/
private IPv6AcceptFilter(){};
/**
* Ignore multiple thread sync problem in extreme case
*/
public static IPAcceptFilter getInstance(){
if(instance == null){
instance = new IPv6AcceptFilter();
}
return instance;
}
@Override
public boolean accept(String ipAddress) {
return ipAddress != null && ipAddress.indexOf(IPv6KeyWord) > -1;
}
}Test.javapackage org.shuochen.test.network;
public class Test {
public static void main(String[] args) {
System.out.println(ServerHost.getInstance().getExtranetIPAddress());
System.out.println(ServerHost.getInstance().getExtranetIPv4Address());
System.out.println(ServerHost.getInstance().getExtranetIPv6Address());
}
} 写的不错,学习了 每种语言都大同小异,和C#差不多。
页:
[1]