java如何获取mac地址?

Python021

java如何获取mac地址?,第1张

以windows举例。

运行命令" cmd ipconfig /all"就会出现以下结果

Physical Address. . . . . . . . . : 20-CF-30-9A-60-EE

java就能过这样的命令来获取。以下是示例。

import java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

public class TestMac

{

public static void main(String[] args) {

System.out.println("Operation System=" + getOsName())

System.out.println("Mac Address=" + getMACAddress())

System.out.println("通过ip获取mac"+getMACAddress("192.168.1.101"))

}

public static String getOsName() {

String os = ""

os = System.getProperty("os.name")

return os

}

public static String getMACAddress() {

String address = ""

String os = getOsName()

if (os.startsWith("Windows")) {

try {

String command = "cmd.exe /c ipconfig /all"

Process p = Runtime.getRuntime().exec(command)

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))

String line

while ((line = br.readLine()) != null) {

if (line.indexOf("Physical Address") >0) {

int index = line.indexOf(":")

index += 2

address = line.substring(index)

break

}

}

br.close()

return address.trim()

} catch (IOException e) {

}

} else if (os.startsWith("Linux")) {

String command = "/bin/sh -c ifconfig -a"

Process p

try {

p = Runtime.getRuntime().exec(command)

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))

String line

while ((line = br.readLine()) != null) {

if (line.indexOf("HWaddr") >0) {

int index = line.indexOf("HWaddr") + "HWaddr".length()

address = line.substring(index)

break

}

}

br.close()

} catch (IOException e) {

}

}

address = address.trim()

return address

}

public static String getMACAddress(String ipAddress) {

String str = "", strMAC = "", macAddress = ""

try {

Process pp = Runtime.getRuntime().exec("nbtstat -a " + ipAddress)

InputStreamReader ir = new InputStreamReader(pp.getInputStream())

LineNumberReader input = new LineNumberReader(ir)

for (int i = 1i <100i++) {

str = input.readLine()

if (str != null) {

if (str.indexOf("MAC Address") >1) {

strMAC = str.substring(str.indexOf("MAC Address") + 14,

str.length())

break

}

}

}

} catch (IOException ex) {

return "Can't Get MAC Address!"

}

//

if (strMAC.length() <17) {

return "Error!"

}

macAddress = strMAC.substring(0, 2) + ":" + strMAC.substring(3, 5)

+ ":" + strMAC.substring(6, 8) + ":" + strMAC.substring(9, 11)

+ ":" + strMAC.substring(12, 14) + ":"

+ strMAC.substring(15, 17)

//

return macAddress

}

}

剑天梦的回答原理和我这个一样,都是通过Process 执行命令。 我直接补充到答案里了。不过

我这边运行那个命令出来的结果很多,那么花的时间就长了。优点是能够获取别人的mac地址

方法主要用来限制系统在其他的机器上运行 其实原理简单的很 没有调用第三方插件 代码如下:

package users util

import    java io *

import    java util *

import    java util regex *

public    class    NetID    {

String    IPCONFIG_MAND_WIN    =    ipconfig    /all

boolean    realMac    =    true

String    unique    =   

public    static    String    getMacAddress()    {

NetID    hwid    =    new    NetID()

return    hwid getUnique() trim()

}

private    String    getUnique()    {

String    os    =    System getProperty( os name )

if    (os startsWith( Windows ))    {

return    getUniqueWindows()

}else    {

return   

}

}

private    String    getUniqueWindows()    {

String    ipConfigResponse    =    null

try    {

ipConfigResponse    =    runConsoleCommand(IPCONFIG_MAND_WIN)

}

catch    (IOException    e)    {

e printStackTrace()

}

StringTokenizer    tokenizer    =    new    StringTokenizer(ipConfigResponse     \n )

while    (tokenizer hasMoreTokens())    {

String    line    =    tokenizer nextToken() trim()

int    macAddressPosition    =    line indexOf( : )

if    (macAddressPosition    <=    )    {

continue

}

String    macAddressCandidate    =    line substring(macAddressPosition    +    )

trim()

if    (isMacAddWin(macAddressCandidate))    {

if    (realMac    ==    true)    {

generateUnique(macAddressCandidate)

}

else    {

realMac    =    true

}

}

}

return    unique

}

private    String    runConsoleCommand(String    mand)    throws    IOException    {

Process    p    =    Runtime getRuntime() exec(mand)

InputStream    stdoutStream    =    new    BufferedInputStream(p getInputStream())

StringBuffer    buffer    =    new    StringBuffer()

while    (true)    {

int    c    =    stdoutStream read()

if    (c    ==    )    {

break

}

buffer append(    (char)    c)

}

String    outputText    =    buffer toString()

stdoutStream close()

return    outputText

}

private    boolean    isMacAddWin(String    macAddressCandidate)    {

Pattern    macPattern    =    pile( [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } [ a fA F]{ } )

Matcher    m    =    macPattern matcher(macAddressCandidate)

return    m matches()

}

private    boolean    isMacAddOSX(String    macAddressCandidate)    {

if    (macAddressCandidate length()    !=    )    {

return    false

}

else    {

return    true

}

}

private    void    generateUnique(String    macAddress)    {

if    (unique    ==    )    {

unique    +=    macAddress

}

else    {

unique    +=    #

unique    +=    macAddress

}

}

public    static    void    main(String [] args)    {

System out println(NetID getMacAddress())

}

lishixinzhi/Article/program/Java/hx/201311/25985

首先,创建工程,包,和一个类。

在此不加详述,我们直接看代码。

这里,我把这个类命名为GetMacAddr

这里,最最关键的就是这里这个方法。

我们通过NetworkInterface这个类来操作。

也就是通过getLocalHost()方法先得到本机IP,

然后调用getHardwareAddress()方法得到一个byte数组的地址。

我们把六位地址传到一个byte数组里面,然后输出来就是。

不多废话,看代码:

private void getMACAddr()

throws SocketException, UnknownHostException {

// 获得IP

NetworkInterface netInterface =

NetworkInterface.getByInetAddress(InetAddress.getLocalHost())

// 获得Mac地址的byte数组

byte[] macAddr = netInterface.getHardwareAddress()

System.out.print("MAC Addr:\t")

// 循环输出

for (byte b : macAddr) {

// 这里的toHexString()是自己写的格式化输出的方法,见下步。

System.out.print(toHexString(b) + " ")

}

}

上一步骤中,为什么会出现一个toHexString()方法呢?

因为可能10进制转16进制时候可能会出现单字符,

所以,如果有出现单字符的情况,我们在其前面添加一个“0”做占位符。

这也是为了视觉的直观,也夹带着个人的习惯。

private static String toHexString(int integer) {

// 将得来的int类型数字转化为十六进制数

String str = Integer.toHexString((int) (integer &0xff))

// 如果遇到单字符,前置0占位补满两格

if (str.length() == 1) {

str = "0" + str

}

return str

}