posts - 310, comments - 6939, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JAVA獲得網卡MAC地址

          Posted on 2007-10-12 14:07 詩特林 閱讀(3070) 評論(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
          不錯
          主站蜘蛛池模板: 霸州市| 上饶市| 沙雅县| 武冈市| 聂荣县| 株洲县| 敖汉旗| 周口市| 朝阳市| 赤壁市| 桃园市| 海伦市| 金山区| 汝州市| 大渡口区| 海晏县| 收藏| 阿克苏市| 鄂伦春自治旗| 论坛| 姚安县| 井研县| 清丰县| 右玉县| 台湾省| 易门县| 沭阳县| 林周县| 乾安县| 昭觉县| 馆陶县| 泸溪县| 五大连池市| 虎林市| 正阳县| 什邡市| 金塔县| 怀远县| 繁昌县| 林口县| 阿巴嘎旗|