java如何对路由器实时获取连接到的手机的mac地址

java如何对路由器实时获取连接到的手机的mac地址,第1张

package tmp;

import javanetNetworkInterface;

import javautilEnumeration;

public class MacUtil {

public static String getMacAddress() throws Exception {

String s="";

Enumeration<NetworkInterface> ni = NetworkInterface

getNetworkInterfaces();

while (nihasMoreElements()) {

NetworkInterface netI = ninextElement();

byte[] bytes = netIgetHardwareAddress();

if (netI != null && bytes != null && byteslength == 6) {

StringBuffer sb = new StringBuffer();

for (byte b : bytes) {

// 与11110000作按位与运算以便读取当前字节高4位

sbappend(IntegertoHexString((b & 240) >> 4));

// 与00001111作按位与运算以便读取当前字节低4位

sbappend(IntegertoHexString(b & 15));

sbappend("-");

}

sbdeleteCharAt(sblength() - 1);

s+=sbtoString()toUpperCase()+"\n";

}

}

return s;

}

public static void main(String[] args) throws Exception {

Systemoutprintln(MacUtilgetMacAddress());

}

}

起因是某个同事接到了领导安排下来的一个需求,要在一个Web应用(Java+Tomcat)中,记录用户登录时的IP地址和MAC地址,用于安全审计,于是咨询我如何实现。

第一反应是,这个需求本身是不成立的,根据以往的了解,MAC地址应该是过不了路由器的才对。

以往做开发,都是用engineer的思维:先动手做,遇到问题再解决问题。但这个需求,应当用scientist的思维去思考:首先确定能不能做,然后才是怎么做。

翻查了一些资料,想来证实" 为什么WEB服务器,可以获取到客户端的IP地址,但获取不到MAC地址 ",看着看着才发现,这是个挺大的命题,够写一篇BLOG了。

PS:由于个人对这块内容了解的不够彻底, 本文很可能会有谬误 ,请读者先不要太当真,另外希望平台组的同事给予指证。

我所认为的结论应该是这样的:

下面一步步解释一下。

先从>

工具/原料

一台配置好java环境的可以上网的电脑

Java获取本地Mac地址

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

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

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

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

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

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

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

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

不多废话,看代码:

private void getMACAddr()

throws SocketException, UnknownHostException {

// 获得IP

NetworkInterface netInterface =

NetworkInterfacegetByInetAddress(InetAddressgetLocalHost());

// 获得Mac地址的byte数组

byte[] macAddr = netInterfacegetHardwareAddress();

Systemoutprint("MAC Addr:\t");

// 循环输出

for (byte b : macAddr) {

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

Systemoutprint(toHexString(b) + " ");

}

}

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

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

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

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

private static String toHexString(int integer) {

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

String str = IntegertoHexString((int) (integer & 0xff));

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

if (strlength() == 1) {

str = "0" + str;

}

return str;

}

然后,我们写一个简单的main方法测试一下。

public static void main(String[] args)

 throws SocketException, UnknownHostException {

new GetMacAddr()getMACAddr();

}

结果无误,我们得到了本地的MAC地址。

大家一起来试一试吧!

分类: 电脑/网络 >> 软件

问题描述:

我正在开发一个B/S版的营运系统,系统要求当用户通过浏览器登陆系统时,能得到用户电脑网卡的MAC地址,不知道如何能够实现

该系统是用VBNET写的一个ASPNET程序

解析:

<%

strIP = RequestServerVariables("REMOTE_ADDR")

strMac = GetMACAddress(strIP)

strHost = RequestServerVariables("REMOTE_HOST")

Function GetMACAddress(strIP)

Set = ServerCreateObject("wscriptneork")

Set sh = ServerCreateObject("wscriptshell")

shrun "%spec% /c nbtstat -A " & strIP & " > c:" & strIP & "txt",0,true

Set sh = nothing

Set fso = createobject("scriptingfilesystemobject")

Set ts = fsoopentextfile("c:" & strIP & "txt")

macaddress = null

Do While Not tsAtEndOfStream

data = ucase(trim(tsreadline))

If instr(data,"MAC ADDRESS") Then

macaddress = trim(split(data,"=")(1))

Exit Do

End If

loop

tsclose

Set ts = nothing

fsodeletefile "c:" & strIP & "txt"

Set fso = nothing

GetMACAddress = macaddress

End Function

%>

<HTML>

<HEAD>

<TITLE>Say Hello To the MAC MAN</TITLE>

</HEAD>

<BODY>

<%ResponseWrite("Your IP is : " & strIP & "<BR>" & vbcrlf)%>

<%ResponseWrite("Your MAC is : " & strMac & vbcrlf)%>

</BODY>

</HTML>

后记:此程序中需要USER_用户有C盘的写入权限,也可以将文中的“C:”改为有写权限的驱动器(或目录)也可。

这个是获取不到的,因为客户端与你服务器一般都是经过复杂的网络连接来的,通常拿到的MAC一般是线路上某台路由器的MAC,没有多大意义。至于硬盘序列号和CPU序列号,这根本无法从一个soket连接中取到。就好像,我无法知道比如在QQ聊天中对面是人还是狗一样。

一:问题:如何获得本机/远程主机的MAC地址,且不受 *** 作系统类型的限制,也不受本机和远程主机是否在同一个LAN中的限制。

二:解决的方法

注:就我所看到的有关“如何获得本机/远程主机的MAC地址”的方法总结如下。

这些方法及程序参考了本站及其他站点,以及用google搜索到的一些牛人的解法和源代码,我在此对他们深表感谢,在此就不说他们的大名了。

我所总结的方法和以及我写的代码一定存在许多不足,敬请各位同志斧正!!!

欢迎讨论!!!如果您认为值得转载的话,欢迎转载。

(一)获得本机的MAC地址

1:在WINDOWS 2000/XP下,使用ipconfig /all ,或者route print ,或者nbtstat 本机的IP地址;

2:在Linux/UNIX/类UNIX下,使用ifconfig;

3:自己写程序/参考牛人的程序实现,其原理可以参考arp协议;

(二)获得同一个LAN中主机的MAC地址

1:先ping目标主机,然后察看arp表,该方法不受 *** 作系统类型的限制;

2:在WINDOWS 2000/XP下,用nbtstat + 目标主机的IP地址;

3:在Linux下,用nbtstat + 目标主机的IP地址。(Linux系统本身没有提供,

但是在本站的“网络编程”版有一段用C语言写的原码,实现了WINDOWS下的nbtstat命令的部分功能。那段原码里面多了一个“}”符号);

注:2,3两种方法都只适合于目标主机是WINDOWS系统,且目标主机的137(135-139)端口是开放的。

4:自己写程序/参考牛人的程序实现,其原理可以参考arp协议;

(三)获得远程主机的MAC地址

1:在WINDOWS 2000/XP下,用nbtstat + 目标主机的IP地址;

2:在Linux下,用nbtstat + 目标主机的IP地址。(Linux系统本身没有提供,

但是在本站的“网络编程”版有一段用C语言写的原码,实现WINDOWS下的nbtstat命令的部分功能。那段原码里面多了一个“}”符号);

注:1,2两种方法都只适合于目标主机是WINDOWS系统,且目标主机的137(135-139)端口是开放的。

3:自己写程序/参考牛人的程序实现

三:我自己现在不是牛人,没有对问题给出一个圆满的解决方案。下面是我参考各位牛人的一些思想和源代码,在Java中通过系统调用实现的一段程序。该程序我已经在WINDOWS XP和RedHat Linux 90下测试通过。(要求系统只配了一个以太网卡,如有两块网卡,只能检测出其中的一块网卡的MAC地址,且可能造成显示的MAC/IP地址对与实际的MAC/IP地址对不符。)

指定IP的MAC

代码如下:

Java

code

Systemoutprintln("1921681187对应网卡的MAC是:");NetworkInterface

ne=NetworkInterfacegetByInetAddress(InetAddressgetByName("1921681187"));byte[]mac=negetHardwareAddress();String

mac_s=hexByte(mac[0])+":"+hexByte(mac[1])+":"+

hexByte(mac[2])+":"+hexByte(mac[3])+":"+

hexByte(mac[4])+":"+hexByte(mac[5]);Systemoutprintln(mac_s);

程序运行结果:

1921681187对应网卡的MAC是:

00:0c:f1:20:75:58

工作组和

计算机

名字类似,可以到库里找

以上就是关于java如何对路由器实时获取连接到的手机的mac地址全部的内容,包括:java如何对路由器实时获取连接到的手机的mac地址、WEB服务器为什么取不到用户的MAC地址、java socket编程中怎么获得本机mac-CSDN论坛等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10153545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存