先看一段代码:the IP address of the local host. 在大多数机器上都可以取到本机ip
- InetAddress.getLocalHost().getHostAddress()
但是多网卡配置的时候,就悲剧了:下图这个机器使用上面的命令取回的是127.0.0.1。
用ifconfig看网卡:
这个时候就需要枚举多网卡判断了
- Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
然后结合IP4的地址段做区分,主要利用以下两个方法:
- ip.isSiteLocalAddress() && !ip.isLoopbackAddress()
最终方法如下(从网上copy来的..)
- /**
- * 多IP处理,可以得到最终ip
- * @return
- */
- public static String getIp() {
- String localip = null;// 本地IP,如果没有配置外网IP则返回它
- String netip = null;// 外网IP
- try {
- Enumeration<NetworkInterface> netInterfaces = NetworkInterface
- .getNetworkInterfaces();
- InetAddress ip = null;
- boolean finded = false;// 是否找到外网IP
- while (netInterfaces.hasMoreElements() && !finded) {
- NetworkInterface ni = netInterfaces.nextElement();
- Enumeration<InetAddress> address = ni.getInetAddresses();
- while (address.hasMoreElements()) {
- ip = address.nextElement();
- // System.out.println(ni.getName() + ";" + ip.getHostAddress()
- // + ";ip.isSiteLocalAddress()="
- // + ip.isSiteLocalAddress()
- // + ";ip.isLoopbackAddress()="
- // + ip.isLoopbackAddress());
- if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress()
- && ip.getHostAddress().indexOf(":") == -1) {// 外网IP
- netip = ip.getHostAddress();
- finded = true;
- break;
- } else if (ip.isSiteLocalAddress()
- && !ip.isLoopbackAddress()
- && ip.getHostAddress().indexOf(":") == -1) {// 内网IP
- localip = ip.getHostAddress();
- }
- }
- }
- } catch (SocketException e) {
- e.printStackTrace();
- }
- if (netip != null && !"".equals(netip)) {
- return netip;
- } else {
- return localip;
- }
- }