posts - 310, comments - 6939, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JAVA获得网卡MAC地址

Posted on 2007-10-12 14:07 诗特林 阅读(3045) 评论(4)  编辑  收藏 所属分类: Java

前阵子看到一篇文件,JAVA得到网卡物理地址(windows和Linux) ,当时觉得挺好,后来正好项目里有需要,就用了它,但好像有点问题.因为它是采用固定字符串搜索(if (line.indexOf("Physical Address"!= -1)获得MAC 地址的,后来在应用时出了问题,因为没有"Physical Address"这一项.后来在外网在查查了一下,后来发现老外有写一个这样的类,可能那样的方式更加可靠一点.算是做个标记.

package sterning.queue;
import java.net.InetAddress;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.StringTokenizer;


public final class NetworkUtils {

  
private final static int MACADDR_LENGTH = 17;
  
private final static String WIN_OSNAME = "Windows";
  
private final static String WIN_MACADDR_REG_EXP =
   
"^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$";
  
private final static String WIN_MACADDR_EXEC = "ipconfig /all";


  
public final static String getMacAddress() throws IOException {
    String os 
= System.getProperty("os.name");
    
try {
      
if (os.startsWith(WIN_OSNAME)) {
         
return winMacAddress(winIpConfigCommand());
      }

      
// 下面是其它的操作系统的代码,省略了!
      
//   LINUX -->    else if (os.startsWith("Linux")) { 
      
//                
      
//                Process p = Runtime.getRuntime().exec("ifconfig");
      
//   MAC OSX -->  else if(os.startsWith("Mac OS X")) { 
      
//                
      
//                Process p = Runtime.getRuntime().exec("ifconfig");
      else {
         
throw new IOException("OS not supported : " + os);
      }

    }

    
catch(ParseException e) {
      e.printStackTrace();
      
throw new IOException(e.getMessage());
    }

  }


  
private final static String winMacAddress(String ipConfigOutput) 
        
throws ParseException {
    String localHost 
= null;
    
try {
      localHost 
= InetAddress.getLocalHost().getHostAddress();
    }

    
catch(java.net.UnknownHostException ex) {
      ex.printStackTrace();
      
throw new ParseException(ex.getMessage(), 0);
    }


    StringTokenizer tokenizer 
= new StringTokenizer(ipConfigOutput, "\n");
    String lastMacAddress 
= null;

    
while(tokenizer.hasMoreTokens()) {
      String line 
= tokenizer.nextToken().trim();

      
// see if line contains IP address
      if (line.endsWith(localHost) && lastMacAddress != null{
         
return lastMacAddress;
      }


      
// see if line contains MAC address
      int macAddressPosition = line.indexOf(":");
      
if(macAddressPosition <= 0continue;

      String macAddressCandidate 
= line.substring(macAddressPosition + 1).trim();
      
if (winIsMacAddress(macAddressCandidate)) {
         lastMacAddress 
= macAddressCandidate;
         
continue;
      }

    }


    ParseException ex 
= new ParseException
       (
"cannot read MAC address from [" + ipConfigOutput + "]"0);
    ex.printStackTrace();
    
throw ex;
  }



  
private final static boolean winIsMacAddress(String macAddressCandidate) {
    
if (macAddressCandidate.length() != MACADDR_LENGTH)    return false;
    
if (!macAddressCandidate.matches(WIN_MACADDR_REG_EXP)) return false;
    
return true;
  }



  
private final static String winIpConfigCommand() throws IOException {
    Process p 
= Runtime.getRuntime().exec(WIN_MACADDR_EXEC);
    InputStream stdoutStream 
= new BufferedInputStream(p.getInputStream());

    StringBuffer buffer
= new StringBuffer();
    
for (;;) {
       
int c = stdoutStream.read();
       
if (c == -1break;
          buffer.append((
char)c);
    }

    String outputText 
= buffer.toString();
    stdoutStream.close();
    
return outputText;
  }



  
public final static void main(String[] args) {
    
try {
      System.out.println(
"MAC ADDRESS");
      System.out.println(
"  OS          : " 
         
+ System.getProperty("os.name"));
      System.out.println(
"  IP/Localhost: " 
         
+ InetAddress.getLocalHost().getHostAddress());
      System.out.println(
"  MAC Address : " 
         
+ getMacAddress());
    }

    
catch(Throwable t) {
      t.printStackTrace();
    }

  }

}


评论

# re: JAVA获得网卡MAC地址  回复  更多评论   

2007-10-12 23:10 by apple0668
不错,学习了!实际中,如果要做一个投票系统,通过记录pc上的网卡地址来防止重复刷票,鉴于操作系统不一样,上面程序可以做到自动识别操作系统。

# re: JAVA获得网卡MAC地址  回复  更多评论   

2008-07-11 09:26 by Zzz
不错不错,我现在希望能找到如何用程序修改网卡的mac地址,并在5分钟后又再次自动恢复

# re: JAVA获得网卡MAC地址  回复  更多评论   

2008-12-22 15:43 by 塞外野叟
只能得到本地localhost的吗,怎么得到客户端的mac地址。

# re: JAVA获得网卡MAC地址  回复  更多评论   

2009-06-20 14:18 by wyk
不错

只有注册用户登录后才能发表评论。


网站导航: