Método 1: Distinguir o endereço da máquina local de outras máquinas na LAN
/** * Obtenha o endereço mac com base no endereço IP * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostException { // TODO Auto stub de método gerado String str = ""; String macAddress = ""; LOOPBACK_ADDRESS = "127.0.0.1"; // Se for 127.0.0.1, obtenha o endereço MAC local. if (LOOPBACK_ADDRESS.equals(ipAddress)) { InetAddress inetAddress = InetAddress.getLocalHost(); // Parece que este método requer JDK1.6. byte[] mac = NetworkInterface.getByInetAddress(inetAddress) .getHardwareAddress(); // O código a seguir monta o endereço mac em String StringBuilder sb = new StringBuilder(); { if (i != 0) { sb.append("-" } // mac[i] & 0xFF É para converter o byte em um número inteiro positivo String s = Integer.toHexString(mac[i] & 0xFF(s.length() == 1 ? 0 + s : s); Altere as letras minúsculas para maiúsculas para se tornarem o endereço mac normal e retorne macAddress = sb.toString().trim().toUpperCase(); else { // Obtenha o endereço MAC do IP não local try { System.out.println(ipAddress); Process p = Runtime.getRuntime() .exec("nbtstat -A " + ipAddress); ("= ==process=="+p); InputStreamReader ir = new InputStreamReader(p.getInputStream()); while ((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 ex) { } return macAddress;
Vamos dar uma olhada no método dois:
pacote com.alpha.test;importar java.io.BufferedReader;importar java.io.IOException;importar java.io.InputStream;importar java.io.InputStreamReader;importar java.io.LineNumberReader;classe pública GetMac {/** * java obtém o endereço MAC da placa de rede do cliente * * @param args */public static void main(String[] args) {GetMac get = new GetMac();System.out.println("1="+get.getMAC());System.out.println("2="+get.getMAC("127.0.0.1"));}// 1 .Obtenha o endereço IP do cliente (este deve ser passado do cliente para o background): // Na página jsp é muito simples, request.getRemoteAddr();// Como a camada VIew do sistema é implementada com JSF, solicitações semelhantes não podem ser obtidas diretamente na página, então uma conversão forçada é feita no bean // public String getMyIP() {// try {// FacesContext fc = FacesContext. getCurrentInstance (); // HttpServletRequest request = (HttpServletRequest) fc // .getExternalContext().getRequest();// return request.getRemoteAddr();// } catch (Exception e) {// e.printStackTrace();// }// return "";// }// 2. Obtenha o endereço MAC do cliente // Chame o comando da janela , no Bean de fundo, obtenha o endereço mac através do ip. O método é o seguinte: // Velocidade de execução [rápida] public String getMAC() {String mac = null; try {Process pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig/all");InputStream is = pro .getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String mensagem = br.readLine();int index = -1;while (message! = null) {if ((index = message.indexOf("Endereço físico")) > 0) {mac = message.substring(index + 36).trim();break;}message = br.readLine();}System.out.println(mac);br.close();pro.destroy();} catch (IOException e) {System.out.println("Não é possível obter o endereço mac!");return null;}return mac;}//Velocidade de execução [lenta] public String getMAC(String ip) {String str = null;String macAddress = null ;tente {Processo p = Runtime.getRuntime().exec("nbtstat -A " + ip);InputStreamReader ir = novo InputStreamReader(p.getInputStream());LineNumberReader input = new LineNumberReader(ir);for (; true;) {str = input.readLine();if (str != null) {if (str.indexOf("Endereço MAC ") > 1) {macAddress = str.substring(str.indexOf("Endereço MAC") + 14);break;}}}} catch (IOException e) {e.printStackTrace(System.out);return null;}return macAddress;}}
Método três, mais simplificado
importar java.io.IOException;importar java.io.InputStreamReader;importar java.io.LineNumberReader;public class MACAddress { String ip; public MACAddress (String ip){ this.ip = ip } public MACAddress (){ this.ip = "0.0.0.0"; } public String getMac(){ tentar { Processo p = Runtime.getRuntime().exec("arp -n"); InputStreamReader ir = new InputStreamReader(p.getInputStream()); = "(" + this.ip + ")"; while(flag) { String str = input.readLine(); 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 } return this.mac } public void setIp(String ip){ isto.ip = ip;}}
Por fim, temos que ampliar o movimento, amigos, observem com atenção.
A primeira coisa a dizer é: Este método pode suportar a obtenção do endereço MAC da máquina de rede externa.
Eu costumava ter um que só conseguia acessar a LAN. Você não poderá acessá-lo se tiver um firewall, mas não precisa se preocupar com isso.
Testei o IP do Baidu e consegui o endereço MAC.
java obtém endereço mac através de ip - bloquear ip bloquear endereço mac
importar java.io.BufferedReader;importar java.io.InputStreamReader;importar java.util.regex.Matcher;importar java.util.regex.Pattern;/*** Obter endereço MAC* @autor* 2011-12*/classe pública GetMacAddress { public static String callCmd(String[] cmd) { String resultado = "" String line = ""; Runtime.getRuntime().exec(cmd); InputStreamReader is = new InputStreamReader(proc.getInputStream()); += linha; } } catch(Exception e) { e.printStackTrace(); cmd primeiro comando* @param outro segundo comando* @return resultado da execução do segundo comando*/ public static String callCmd(String[] cmd,String[] another) { String result = "" String line = ""; Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(cmd); //O primeiro comando foi executado e o segundo comando foi executado proc = rt.exec(outro); InputStreamReader é = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader (é); } } catch(Exception e) { e.printStackTrace() } return resultado } /** * * @param ip; IP de destino, geralmente dentro da LAN* @param sourceString A string resultante do processamento do comando* @param macSeparator símbolo separador mac* @return endereço mac, representado pelo símbolo separador acima*/ public static String filterMacAddress(final String ip, final String sourceString ,string final macSeparator) { String resultado = ""; String regExp = "(([0-9,AF,af]{1,2}" + macSeparator + "){1,5})[0-9,AF,af]{1,2})"; Padrão padrão = Pattern.compile(regExp); ()){ resultado = matcher.group(1); if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) { break; //Se houver vários IPs, apenas o Mac correspondente a este IP será correspondido. ){ String resultado = ""; String[] cmd = { "cmd", "/c", "ping " + ip }; }; Corda cmdResult = callCmd(cmd,another); resultado = filterMacAddress(ip,cmdResult,"-"); /** * @param ip target ip * @return Endereço Mac * */ public static String getMacInLinux(final String ip){ String resultado = ""; String[] cmd = { "/bin/sh", "-c", "ping " + ip + " -c 2 && arp -a" }; String cmdResult = callCmd(cmd); result = filterMacAddress(ip,cmdResult,":"); return result; } /** * Obtém o endereço MAC* @return Retorna o endereço MAC*/ public String estática getMacAddress(String ip){ String macAddress = ""; macAddress = getMacInWindows(ip).trim(); if(macAddress==null||"".equals(macAddress)){ macAddress = getMacInLinux(ip).trim() } return macAddress } //Faça um teste public static void main(String[] args) { System; .out.println(getMacAddress("220.181.111.148"));