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论坛等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)