码迷,mamicode.com
首页 > 编程语言 > 详细

Java获取操作系统的本机ip和Mac地址

时间:2015-09-05 23:58:32      阅读:507      评论:0      收藏:0      [点我收藏+]

标签:

  1. 获取局域网ip和mac(如果电脑没有直接连接外网),否则获取公网ip

  2. 通过第三放获取公网ip

package org.twt.zipjar.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;


public class NetworkUtils {

	/**
	 * 获取本地IP列表(针对多网卡情况)
	 * @return
	 */
	public static Map<String, Object> getLocalInetMac() {

		Map<String, Object> ipMacInfo = null;
		try {
			Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
					.getNetworkInterfaces();
			while (networkInterfaces.hasMoreElements()) {
				NetworkInterface networkInterface = networkInterfaces
						.nextElement();
				Enumeration<InetAddress> inetAddresses = networkInterface
						.getInetAddresses();

				while (inetAddresses.hasMoreElements()) {
					InetAddress inetAddress = inetAddresses.nextElement();
					ipMacInfo = pickInetAddress(inetAddress, networkInterface);
					if (ipMacInfo != null) {
						return ipMacInfo;
					}
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
		return null;
	}

	private static Map<String, Object> pickInetAddress(InetAddress inetAddress,
			NetworkInterface ni) {
		try {
			String name = ni.getDisplayName();
			if (name.contains("Virtual Ethernet Adapter")
					|| name.contains("Virtual") || name.contains("VMnet")) {
				return null;
			}
			if (ni.isVirtual() || !ni.isUp() || !ni.supportsMulticast()) {
				return null;
			}

			InetAddress localHost = InetAddress.getLocalHost();
			if (inetAddress.isSiteLocalAddress()
					&& localHost.getHostName().equals(inetAddress.getHostName())) {
				Formatter formatter = new Formatter();
				String sMAC = null;
				byte[] macBuf = ni.getHardwareAddress();
				for (int i = 0; i < macBuf.length; i++) {
					sMAC = formatter.format(Locale.getDefault(), "%02X%s",
							macBuf[i], (i < macBuf.length - 1) ? "-" : "")
							.toString();
				}
				formatter.close();
				Map<String, Object> ipMacInfo = new HashMap<String, Object>();
				ipMacInfo.put("hostname", inetAddress.getHostName()); //系统当前hostname
				ipMacInfo.put("ip", inetAddress.getHostAddress()); //ip地址
				ipMacInfo.put("ipnet", inetAddressTypeName(inetAddress)); //网络类型
				ipMacInfo.put("os", System.getProperty("os.name")); //系统名称
				ipMacInfo.put("mac", sMAC); //mac 地址
				ipMacInfo.put("cpu-arch", System.getProperty("os.arch")); //cpu架构
				ipMacInfo.put("network-arch", ni.getDisplayName()); //网卡名称
				return ipMacInfo;
			}

		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return null;
	}

	private static String inetAddressTypeName(InetAddress inetAddress) {
		return (inetAddress instanceof Inet4Address) ? "ipv4" : "ipv6";
	}

	//通过第三方网站http://1111.ip138.com/ic.asp获取ip
private static Map<String, String> getOpenNetworkIp() {
		
		try {
			URLConnection openConnection = new URL("http://1111.ip138.com/ic.asp").openConnection();
			openConnection.setDoInput(true);
			openConnection.connect();
			InputStream is =  (InputStream) openConnection.getContent();
			BufferedReader br = new BufferedReader(new InputStreamReader(is,Charset.forName("GBK")));
			StringBuilder sb = new StringBuilder();
			String str = null;
			while((str=br.readLine())!=null)
			{
				sb.append(str);
			}
			String htmlSrc = sb.toString().toLowerCase(Locale.getDefault());
			String startTag = "<center>";
			String endTag = "</center>";
			htmlSrc = htmlSrc.substring(htmlSrc.indexOf(startTag)+startTag.length(), htmlSrc.lastIndexOf(endTag));
			String openIp = htmlSrc.substring(htmlSrc.indexOf("[")+1, htmlSrc.lastIndexOf("]"));
			String provider = htmlSrc.substring(htmlSrc.lastIndexOf(":")+1);
			
			Map<String, String> resultMap = new HashMap<String, String>();
			resultMap.put("openIp", openIp);
			resultMap.put("provider", provider);
			
			br.close();
			
			return resultMap;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {
		Map<String, Object> localInetMac = getLocalInetMac();
		System.out.println(localInetMac);
		Map<String, String> openNetworkIp = getOpenNetworkIp();
		System.out.println(openNetworkIp);

	}
}

如上方案在Android,Windows,linux都成功了,可能有些地方考虑不太周全,但应该覆盖了90-95%的PC和Android系统,对了,貌似不支持Android 2.2,不过Android本身就可获取mac

public  String getMacAddress( ) 
	{
		WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
		String mac_address = (wifiManager == null ? "" : wifiManager.getConnectionInfo().getMacAddress());
		mac_address = (mac_address == null ? "" : mac_address);
		return mac_address;
    }

下面是运行在Android上的效果

技术分享

Java获取操作系统的本机ip和Mac地址

标签:

原文地址:http://my.oschina.net/ososchina/blog/501447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!