วิธีที่ 1: แยกที่อยู่เครื่องภายในออกจากเครื่องอื่นใน LAN
/** * รับที่อยู่ mac ตามที่อยู่ IP * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) พ่น SocketException, UnknownHostException { // TODO Auto วิธีการสร้าง stub String = ""; String macAddress = ""; LOOPBACK_ADDRESS = "127.0.0.1"; // หากเป็น 127.0.0.1 ให้รับที่อยู่ MAC ในเครื่อง if (LOOPBACK_ADDRESS.equals(ipAddress)) { InetAddress inetAddress = InetAddress.getLocalHost(); // ดูเหมือนว่าวิธีนี้ต้องใช้ JDK1.6. ไบต์[] mac = NetworkInterface.getByInetAddress(inetAddress) .getHardwareAddress(); // รหัสต่อไปนี้ประกอบที่อยู่ mac ลงใน StringStringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { ถ้า (i != 0) { sb.append("-"); } // mac[i] & 0xFF มันคือการแปลงไบต์เป็นจำนวนเต็มบวก String s = Integer.toHexString(mac[i] & 0xFF); sb.append(s.length() == 1 ? 0 + s : s); } // แปลงสตริงทั้งหมด เปลี่ยนอักษรตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่เพื่อให้กลายเป็นที่อยู่ mac ปกติและส่งกลับ macAddress = sb.toString().trim().toUpperCase(); return macAddress; อื่น { // รับที่อยู่ MAC ของ IP ที่ไม่ใช่ในเครื่อง { System.out.println(ipAddress); Process p = Runtime.getRuntime() .exec("nbtstat -A " + ipAddress); ("= ==process=="+p); InputStreamReader ir = ใหม่ InputStreamReader(p.getInputStream()); BufferedReader br = ใหม่ BufferedReader(ir); ในขณะที่ ((str = br.readLine()) != null) { if(str.indexOf("MAC")>1){ macAddress = str.substring(str.indexOf("MAC")+9, str.length ()); macAddress = macAddress.trim(); System.out.println("macAddress:" + macAddress); ทำลาย; ir.close(); } catch (IOException เช่น) { } กลับ macAddress;
ลองดูวิธีที่สอง:
แพ็คเกจ com.alpha.test;นำเข้า java.io.BufferedReader;นำเข้า java.io.IOException;นำเข้า java.io.InputStream;นำเข้า java.io.InputStreamReader;นำเข้า java.io.LineNumberReader;คลาสสาธารณะ GetMac {/** * java รับที่อยู่ MAC ของการ์ดเครือข่ายไคลเอนต์ * * @param args */public static void main(String[] args) {GetMac get = GetMac ใหม่();System.out.println("1="+get.getMAC());System.out.println("2="+get.getMAC("127.0.0.1"));}// 1 . รับที่อยู่ IP ไคลเอนต์ (ต้องส่งผ่านจากไคลเอนต์ไปยังพื้นหลัง): // ใต้หน้า jsp มันง่ายมาก request.getRemoteAddr();// เนื่องจากเลเยอร์ VIew ของระบบถูกนำไปใช้กับ JSF จึงไม่สามารถรับคำขอที่คล้ายกันบนเพจได้โดยตรง ดังนั้นจึงมีการบังคับแปลงใน bean // public String getMyIP() {// try {// FacesContext fc = FacesContext getCurrentInstance ();// คำขอ HttpServletRequest = (HttpServletRequest) fc// .getExternalContext().getRequest();// กลับ request.getRemoteAddr();// } catch (ข้อยกเว้น e) {// e.printStackTrace();// }// return "";// }// 2. รับที่อยู่ mac ของไคลเอ็นต์ // เรียกคำสั่ง window ในพื้นหลัง Bean ให้รับที่อยู่ mac ผ่าน ip วิธีการดังต่อไปนี้: // วิ่งความเร็ว [เร็ว] สาธารณะ String getMAC() {String mac = null; ลอง {Process pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig/all");InputStream คือ = pro .getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));ข้อความสตริง = br.readLine();int index = -1; ในขณะที่ (ข้อความ != null) {if ((index = message.indexOf ("ที่อยู่ทางกายภาพ")) > 0) {mac = message.substring (ดัชนี + 36).trim();break;}message = br.readLine();}System.out.println(mac);br.close();pro.destroy();} จับ (IOException จ) {System.out.println("ไม่สามารถรับที่อยู่ mac!"); return null;} return mac;} // ความเร็วในการทำงาน [ช้า] สาธารณะ String getMAC (String ip) {String str = null; String macAddress = null ; ลอง {Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);InputStreamReader ir = new InputStreamReader(p.getInputStream());LineNumberReader input = new LineNumberReader(ir);for (; true;) {str = input.readLine();if (str != null) {if (str.indexOf("ที่อยู่ MAC) ") > 1) {macAddress = str.substring(str.indexOf("ที่อยู่ MAC") + 14);break;}}}} catch (IOException จ) {e.printStackTrace(System.out);return null;}return macAddress;}}
วิธีที่สาม คล่องตัวยิ่งขึ้น
นำเข้า java.io.IOException; นำเข้า java.io.InputStreamReader; นำเข้า java.io.LineNumberReader; MACAddress สาธารณะ { String ip; String mac; this.ip = "0.0.0.0"; } สตริงสาธารณะ getMac(){ ลอง { ประมวลผล p = Runtime.getRuntime().exec("arp -n"); InputStreamReader (p.getInputStream()); อินพุต LineNumberReader = new LineNumberReader(ir); = "(" + this.ip + ")"; while(flag) { String str = input.readLine(); if (str != null) { if (str.indexOf(ipStr) > 1) { int temp = str.indexOf("at"); this.mac = str.substring( temp + 3, temp + 20 } อื่นแตก; = false; } } catch (IOException | InterruptedException e) { e.printStackTrace(System.out); } คืนค่าโมฆะสาธารณะ setIp (สตริง ip) นี่.ไอพี = ไอพี; }}
สุดท้ายก็ต้องขยายความให้เพื่อนๆ ดูให้ดี
สิ่งแรกที่ต้องพูดคือ: วิธีนี้สามารถรองรับการรับที่อยู่ mac ของเครื่องเครือข่ายภายนอกได้
เคยมีอันหนึ่งที่เข้าได้แต่ LAN เท่านั้น คุณไม่สามารถเข้าถึงได้หากคุณมีไฟร์วอลล์ แต่คุณไม่ต้องกังวลเกี่ยวกับเรื่องนี้
ฉันทดสอบ IP ของ Baidu และสามารถรับที่อยู่ Mac ได้
java รับที่อยู่ mac ผ่าน ip - block ที่อยู่ mac ของบล็อก ip
นำเข้า java.io.BufferedReader;นำเข้า java.io.InputStreamReader;นำเข้า java.util.regex.Matcher;นำเข้า java.util.regex.Pattern;/*** รับที่อยู่ MAC* @author* 2011-12*/public class GetMacAddress { callCmd สตริงแบบคงที่สาธารณะ (String [] cmd) { String result = ""; String line = ""; ลอง { Process proc = Runtime.getRuntime().exec(cmd); InputStreamReader คือ = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader (เป็น); while ((line = br.readLine ()) != null) { result += line; } } catch(ข้อยกเว้น e) { e.printStackTrace(); } ส่งคืนผลลัพธ์; cmd คำสั่งแรก* @param คำสั่งที่สองอื่น* @return ผลการดำเนินการของคำสั่งที่สอง*/ public static String callCmd(String[] cmd,String[] another) { String result = ""; String line = ""; Runtime rt = Runtime.getRuntime(); กระบวนการ proc = rt.exec(cmd); proc.waitFor(); // คำสั่งแรกถูกดำเนินการและคำสั่งที่สองถูกดำเนินการ proc = rt.exec(another); InputStreamReader คือ = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader (คือ); } } catch(ข้อยกเว้น e) { e.printStackTrace(); } ส่งคืนผลลัพธ์; } /** * * @param ip IP เป้าหมาย ซึ่งโดยปกติจะอยู่ภายใน LAN* @param sourceString สตริงผลลัพธ์ของการประมวลผลคำสั่ง* @param macSeparator สัญลักษณ์ตัวคั่น mac* @return ที่อยู่ mac แสดงด้วยสัญลักษณ์ตัวคั่นด้านบน*/ สตริงคงที่สาธารณะ filterMacAddress(ip สตริงสุดท้าย, sourceString สตริงสุดท้าย ,สตริงสุดท้าย macSeparator) { ผลลัพธ์สตริง = ""; String regExp = "((([0-9,AF,af]{1,2}" + macSeparator + "){1,5})[0-9,AF,af]{1,2})"; รูปแบบรูปแบบ = Pattern.compile(regExp); Matcher matcher = pattern.matcher(sourceString); ()){ result = matcher.group(1); if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) { แตก; //หากมีหลาย IP จะมีการจับคู่เฉพาะ Mac ที่ตรงกับ IP นี้เท่านั้น } /** * * @param ip target ip * @return Mac Address * */ public static String getMacInWindows(final String ip ){ สตริงผลลัพธ์ = ""; String[] cmd = { "cmd", "/c", "ping " + ip }; String[] another = { "cmd", "/c", "arp -a" }; สตริง cmdResult = callCmd(cmd,another); result = filterMacAddress(ip,cmdResult,"-"); ส่งคืนผลลัพธ์; } /** * @param ip target ip * @return Mac Address * */ public static String getMacInLinux(final String ip){ สตริงผลลัพธ์ = ""; สตริง[] cmd = { "/bin/sh", "-c", "ping " + ip + " -c 2 && arp -a" }; String cmdResult = callCmd(cmd); result = filterMacAddress(ip,cmdResult,"); return result; } /** * รับที่อยู่ MAC* @return คืนที่อยู่ MAC*/ public สตริงคงที่ getMacAddress (สตริง ip) { สตริง macAddress = ""; macAddress = getMacInWindows (ip) ตัดแต่ง (); if(macAddress==null||"".equals(macAddress)){ macAddress = getMacInLinux(ip).trim(); } ส่งคืน macAddress; } // ทำการทดสอบ public static void main(String[] args) { System .out.println(getMacAddress("220.181.111.148"));