JAVA实现获取MAC地址
- 格式:docx
- 大小:67.34 KB
- 文档页数:5
java获取当前接口请求路径的几种方法在Java开发中,有时候我们需要获取当前接口的请求路径,以便进行一些处理。
下面我将介绍几种常用的方法来获取当前接口的请求路径。
1. 使用HttpServletRequest对象在Servlet或者Spring MVC中,我们可以通过HttpServletRequest对象获取当前请求的路径。
可以使用如下代码来获取:```HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String requestUrl = request.getRequestURL().toString();String queryString = request.getQueryString();String fullPath = requestUrl + (queryString != null ? "?" + queryString : "");```通过`getRequestURL()`方法获取请求的URL,再使用`getQueryString()`方法获取请求URL中的查询参数。
最后将二者拼接起来,即可得到完整的请求路径。
2. 使用HttpRequestUtils工具类如果项目中没有使用Servlet或Spring MVC框架,我们可以自己编写一个HttpRequestUtils工具类,代码如下:```import javax.servlet.http.HttpServletRequest;public class HttpRequestUtils {public static String getRequestUrl(HttpServletRequest request) {StringBuffer requestUrl = request.getRequestURL();String queryString = request.getQueryString();String fullPath = requestUrl + (queryString != null ? "?" + queryString : "");return fullPath;}}```在需要获取请求路径的地方,如下调用该工具类的方法即可:```HttpServletRequest request = ...;String requestUrl = HttpRequestUtils.getRequestUrl(request);```3. 使用JAX-RS的UriInfo对象如果你在使用JAX-RS开发RESTful服务,可以使用UriInfo对象获取请求路径。
import java.io.IOException;import java.io.InputStreamReader;import java.io.LineNumberReader;publicclass GetMACAddress {public String getMACAddress(String ipAddress) {String str = "", strMAC = "", macAddress = "";try {Process pp = Runtime.getRuntime().exec("nbtstat -a " + ipAddress);InputStreamReader ir = newInputStreamReader(pp.getInputStream());LineNumberReader input = new LineNumberReader(ir);for (int i = 1; i <100; i++) {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;}publicstaticvoid main(String[] args) {GetMACAddress getMACAddress = new GetMACAddress();System.out.println(getMACAddress.getMACAddress("59.78.63.38")); //获得该ip地址的mac地址}publicstatic String procAll(String str) {return procStringEnd(procFirstMac(procAddress(str)));publicstatic String procAddress(String str) {int indexof = str.indexOf("Physical Address");if (indexof >0) {return str.substring(indexof, str.length());}return str;}publicstatic String procFirstMac(String str) {int indexof = str.indexOf(":");if (indexof >0) {return str.substring(indexof + 1, str.length()).trim(); }return str;}publicstatic String procStringEnd(String str) {int indexof = str.indexOf("\r");if (indexof >0) {return str.substring(0, indexof).trim();}return str;}。
java 获取路径在日常开发中,获取文件路径是一个常见任务,特别是在使用java实现多层次的文件路径交互时,更是重要。
对于java开发人员来说,可以借助一些已有的函数实现路径的获取,也可以通过某些特定的类来完成。
一、java中的路径获取方式在java中,开发者可以通过两种方式来获取路径,分别是通过文件操作类和文件系统路径类来实现。
1.文件操作类文件操作类是java.io.*包中的一个类,主要用于处理文件操作,提供了getCanonicalPath()、getAbsolutePath()和getPath()等方法,可以用于获取文件的路径,如下:// 使用File类中的getCanonicalPath()方法获取路径File file = new File(myfile.txtString canonicalPath = file.getCanonicalPath();System.out.println(CanonicalPath: + canonicalPath);// 使用File类中的getAbsolutePath()方法获取路径String absolutePath = file.getAbsolutePath();System.out.println(AbsolutePath: + absolutePath);// 使用File类中的getPath()方法获取路径String path = file.getPath();System.out.println(Path: + path);2.文件系统路径类文件系统路径类是java.nio.file.Paths是java.nio.file包中的一个类,是一个与文件系统相关的类,常用的方法有get()和toAbsolutePath(),可以用于获取路径,如下:// 使用Path中的get()方法获取路径String path = Paths.get(myfile.txttoString();System.out.println(Path: + path);// 使用Paths中的toAbsolutePath()方法获取路径Path path1 = Paths.get(myfile.txttoAbsolutePath();System.out.println(Path1: + path1);二、路径类型分析1.绝对路径绝对路径是指从操作系统根目录开始,包含全部文件和目录的路径,其特点是由一系列的“/”(反斜杠)组成,从第一个“/”开始一直到最后一个“/”结束,是一条完整的路径,不会受其他路径的影响。
JAVA如何获取客户端IP地址和MAC地址本⽂介绍了JAVA如何获取客户端IP地址和MAC地址,分享给⼤家,具体如下:1.获取客户端IP地址public String getIp(HttpServletRequest request) throws Exception {String ip = request.getHeader("X-Forwarded-For");if (ip != null) {if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {int index = ip.indexOf(",");if (index != -1) {return ip.substring(0, index);} else {return ip;}}}ip = request.getHeader("X-Real-IP");if (ip != null) {if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {return ip;}}return request.getRemoteAddr();}为什么不直接使⽤request.getRemoteAddr();⽽要在之前判断两个请求头"X-Forwarded-For"和"X-Real-IP"X-Forwarded-For: client1, proxy1, proxy2, proxy3其中的值通过⼀个逗号+空格把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到⼀个请求,就把请求来源IP地址添加到右边。
所有我们只取第⼀个IP地址X-Real-IP,⼀般只记录真实发出请求的客户端IP解决⽤localhost访问ip为0:0:0:0:0:0:0:1的问题public String getIp(HttpServletRequest request) throws Exception {String ip = request.getHeader("X-Forwarded-For");if (ip != null) {if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {int index = ip.indexOf(",");if (index != -1) {return ip.substring(0, index);} else {return ip;}}}ip = request.getHeader("X-Real-IP");if (ip != null) {if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {return ip;}}ip = request.getHeader("Proxy-Client-IP");if (ip != null) {if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {return ip;}}ip = request.getHeader("WL-Proxy-Client-IP");if (ip != null) {if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {return ip;}}ip = request.getRemoteAddr();return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;}2.获取客户端MAC地址UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip);String smac = umac.GetRemoteMacAddr();添加⼀个获取MAC的时间限制final UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip);//---长时间获取不到MAC地址则放弃ExecutorService exec = Executors.newFixedThreadPool(1);Callable<String> call = new Callable<String>() {public String call() throws Exception {return umac.GetRemoteMacAddr();}};try {Future<String> future = exec.submit(call);String smac = future.get(1000 * 1, LISECONDS);loginMonitor.setMacAddress(smac);} catch (TimeoutException ex) {loginMonitor.setMacAddress("获取失败");("获取MAC地址超时");}// 关闭线程池exec.shutdown();//---需要先获取IP地址作为参数构造⼀个UdpGetClientMacAddrUdpGetClientMacAddr.javapackage monsys.security.controller;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;/*** 主机A向主机B发送“UDP-NetBIOS-NS”询问包,即向主机B的137端⼝,发Query包来询问主机B的NetBIOS Names信息。
查看mac地址的方法
要查看MAC地址,可以按照以下步骤进行操作:
1. 在Mac电脑上,点击屏幕左上角的"苹果"图标。
2. 从下拉菜单中选择“系统偏好设置”。
3. 在系统偏好设置窗口中,找到并点击“网络”选项。
4. 在网络设置窗口左侧的列表中,选择你当前正在使用的网络类型(Wi-Fi、以太网等)。
5. 在右侧窗口中,点击“高级”按钮。
6. 在弹出的高级设置窗口中,选择“硬件”标签。
7. 在“硬件地址”一栏中,就是你的MAC地址。
这个地址通常由十六进制数表示,由六个双字节组成,每个双字节用两个冒号(:)分隔。
例如,00:11:22:33:44:55。
JAVA实现获取MAC地址获取MAC地址是通过Java程序来获取设备的物理地址,MAC地址是网卡的唯一标识符,用于在网络中唯一地标识一个设备。
Java中获取MAC地址的实现方式有多种,下面将介绍几种常用的方式:1. 使用InetAddress类和NetworkInterface类```javapublic class GetMacAddresspublic static void main(String[] args)tryInetAddress ipAddress = InetAddress.getLocalHost(;NetworkInterface networkInterface =NetworkInterface.getByInetAddress(ipAddress);byte[] macAddressBytes =networkInterface.getHardwareAddress(;StringBuilder macAddressBuilder = new StringBuilder(;for (int i = 0; i < macAddressBytes.length; i++)macAddressBuilder.append(String.format("%02X%s", macAddressBytes[i], (i < macAddressBytes.length - 1) ? "-" : ""));}String macAddress = macAddressBuilder.toString(;System.out.println("MAC Address: " + macAddress);} catch (UnknownHostException , SocketException e)e.printStackTrace(;}}```这种方法通过获取本机的InetAddress对象,然后通过该对象获取对应的NetworkInterface对象,再通过该对象获取硬件地址(MAC地址),最后将硬件地址格式化成常见的xx-xx-xx-xx-xx-xx形式。
如何获取本机电脑的mac地址?方法有以下几种:1,点击开始后,选择[运行]之后输入[cmd]打开一个Command的窗口这时在里面输入[getmac]就能查看Mac地址2,在Windows 9X系列的计算机系统:依次单击“开始”→“运行”→输入“winipcfg”→回车,其中适配器地址就是计算机的MAC地址。
3,在Windows 2000/XP的计算机系统中,依次单击“开始”→“运行”→输入“cmd”→回车,在出现的命令提示符界面中输入“ipconfig /all”→回车,可以得到计算机的MAC地址,其中Physical Address就是计算机的MAC地址。
另外,在所有系统中,获取MAC地址还有另外一种较特别的方法,这种方法无须在命令行提示符下键入命令,无须牢记复杂的命令。
只要鼠标轻点几下即可。
方法是:鼠标依次点击“开始→所有程序→附件→系统工具→系统信息”在“系统摘要”下,展开“组件→网络→适配器”,右边的摘要中就会列出本机的MAC 地址。
4,如果您在线,还可以用以下方法查MAC地址:首先启动IE连接到网络,鼠标右击任务栏中托盘区中的网络连接图标(两台小电脑),点选“状态”→“支持”选项卡下的“详细信息”,其中的实际地址即为您网卡的MAC地址如何获取局域网其他计算机的MAC地址?我们是6个人使用一个路由器上网的,这样属于局域网吗?怎样在一台机子上看别人的MAC地址,计算机名,和IP地址?在不借助第三方软件的情况下.arp -a好像只能看自己的MAC地址吧?windows中的ARP命令可以。
实际上ARP协议就是获取对方mac地址的,可以查看一下。
比如你们都是自动获取ip,只需要在六台机器全开的情况下,在运行中键入arp -a你的缓存中肯定会有对方的mac,然后ipconfig /all看一看自己的是那个,区分一下就ok了在局域网中由于是在办公室,只有一台公共电脑能上网,如果你经常也要上网找资料怎么办?1.首先去能上网的公共电脑上的"运行"中输入"CMD"回车,再输入"ipcongfig" /all 按回车,会显示出此机ip 设置信息,这些信息中我们要记住"物理地址"和"IP 地址",默认网关等,一般我只记物理和IP地址两项。
Java获取机器IP的方法在Java中,我们可以使用多种方法来获取机器的IP地址。
本文将介绍几种常用的方法,包括使用Java标准库、使用第三方库以及使用系统命令等方式。
1. 使用Java标准库Java标准库提供了一些类和方法来获取机器的IP地址。
其中最常用的是InetAddress类。
1.1 使用InetAddress.getLocalHost()方法import .InetAddress;import .UnknownHostException;public class GetMachineIP {public static void main(String[] args) {try {InetAddress localHost = InetAddress.getLocalHost();System.out.println("Machine IP: " + localHost.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}}通过调用InetAddress.getLocalHost()方法,我们可以获取本地机器的IP地址。
该方法返回一个InetAddress对象,其中包含了本地机器的IP地址信息。
通过调用getHostAddress()方法,我们可以获得具体的IP地址。
1.2 使用NetworkInterface.getNetworkInterfaces()方法import .InetAddress;import workInterface;import .SocketException;import java.util.Enumeration;public class GetMachineIP {public static void main(String[] args) {try {Enumeration<NetworkInterface> networkInterfaces = NetworkInterface. getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElem ent();Enumeration<InetAddress> inetAddresses = networkInterface.getI netAddresses();while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();if (!inetAddress.isLoopbackAddress() && !inetAddress.isLin kLocalAddress()&& inetAddress.isSiteLocalAddress()) {System.out.println("Machine IP: " + inetAddress.getHos tAddress());}}}} catch (SocketException e) {e.printStackTrace();}}}通过调用NetworkInterface.getNetworkInterfaces()方法,我们可以获取当前机器上所有的网络接口。
java实现获取⽤户的MAC地址⽅法⼀:将本机地址与局域⽹内其他机器区分开来/*** 根据IP地址获取mac地址* @param ipAddress 127.0.0.1* @return* @throws SocketException* @throws UnknownHostException*/public static String getLocalMac(String ipAddress) throws SocketException,UnknownHostException {// TODO Auto-generated method stubString str = "";String macAddress = "";final String LOOPBACK_ADDRESS = "127.0.0.1";// 如果为127.0.0.1,则获取本地MAC地址。
if (LOOPBACK_ADDRESS.equals(ipAddress)) {InetAddress inetAddress = InetAddress.getLocalHost();// 貌似此⽅法需要JDK1.6。
byte[] mac = NetworkInterface.getByInetAddress(inetAddress).getHardwareAddress();// 下⾯代码是把mac地址拼装成StringStringBuilder sb = new StringBuilder();for (int i = 0; i < mac.length; i++) {if (i != 0) {sb.append("-");}// mac[i] & 0xFF 是为了把byte转化为正整数String s = Integer.toHexString(mac[i] & 0xFF);sb.append(s.length() == 1 ? 0 + s : s);}// 把字符串所有⼩写字母改为⼤写成为正规的mac地址并返回macAddress = sb.toString().trim().toUpperCase();return macAddress;} else {// 获取⾮本地IP的MAC地址try {System.out.println(ipAddress);Process p = Runtime.getRuntime().exec("nbtstat -A " + ipAddress);System.out.println("===process=="+p);InputStreamReader ir = new InputStreamReader(p.getInputStream());BufferedReader br = new BufferedReader(ir);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);break;}}p.destroy();br.close();ir.close();} catch (IOException ex) {}return macAddress;}}我们再来看下⽅法⼆:package com.alpha.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class GetMac {/*** java获取客户端⽹卡的MAC地址** @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.获取客户端ip地址( 这个必须从客户端传到后台):// jsp页⾯下,很简单,request.getRemoteAddr() ;// 因为系统的VIew层是⽤JSF来实现的,因此页⾯上没法直接获得类似request,在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.获取客户端mac地址// 调⽤window的命令,在后台Bean⾥实现通过ip来获取mac地址。
(原创实用版4篇)编制人员:_______________审核人员:_______________审批人员:_______________编制单位:_______________编制时间:____年___月___日序言下面是本店铺为大家精心编写的4篇《java获取ip的方法》,供大家借鉴与参考。
下载后,可根据实际需要进行调整和使用,希望能够帮助到大家,谢射!(4篇)《java获取ip的方法》篇1在 Java 中,获取 IP 地址的方法因场景而异。
如果你是在服务器端获取客户端的 IP 地址,可以使用 request.getRemoteAddr() 方法。
但是如果客户端通过代理服务器访问,这个方法获取到的可能是代理服务器的 IP 地址。
此时可以使用 request.getHeader("X-Forwarded-For") 方法获取客户端真实的 IP 地址。
如果客户端未通过代理服务器访问,则可以直接使用request.getRemoteAddr() 方法获取客户端的 IP 地址。
如果你是在客户端获取自己的 IP 地址,可以使用 NetworkInterface 类和InetAddress 类。
首先获取网络接口列表,然后遍历列表中的每一个网络接口,使用 InetAddress 类获取该网络接口的 IP 地址。
最后将获取到的 IP 地址打印出来即可。
《java获取ip的方法》篇2在 Java 中,获取 IP 地址的方法因场景而异。
如果你是在服务器端获取客户端的 IP 地址,可以使用 request.getRemoteAddr() 方法。
但是如果客户端通过代理服务器访问,这个方法返回的将是代理服务器的 IP 地址。
此时可以使用 request.getHeader("X-Forwarded-For") 方法获取客户端真实的 IP 地址。
如果客户端未通过代理服务器访问,则可以直接使用 request.getRemoteAddr() 方法获取客户端的 IP 地址。
Java 学习总结JAVA 操作MYSQL 环境搭建与测试一、Linux 下 JDK 安装1.1 下载 jdk下载地址: /technetwork/java/javase/downloads/index.html 选择版本 和平台这里下载的是 jdk6u22linuxi586.bin1.2 安装:1.2.1给 jdk6u22linuxi586.bin添加可执行权限#chmod +x jdk6u22linuxi586.bin然后执行该文件#./ jdk6u22linuxi586.binJDK 将自动解压缩,出现“Press Enter to continue.....”回车即可完成解压缩。
此时将多 出一个 jdk1.6.0_22 目录#lsjdk1.6.0_22 jdk6u22linuxi586.bin将 jdk1.6.0_22 复制或移动到/usr/local 目录下(自定义 java 的运行目录)#mv jdk1.6.0_22 /usr/local 将进入/usr/local 目录将 jdk1.6.0_22 改为 jdk#cd /usr/local#mv jdk1.6.0_22 jdk1.2.2添加环境变量编制/etc/profile(一定要小心,最好先备份该文件再编辑,一旦出错后果很严重)文件, 在后面添加如下内容。
export JA V A_HOME=/usr/local/jdkexport CLASSPATH=$CLASSPATH:$JA V A_HOME/lib:$JA V A_HOME/jre/libexportexport PA TH=$JA V A_HOME/bin:$JA V A_HOME/jre/bin:$PATH:$HOMR/bin#vi /etc/profile 更改后变为#tail /etc/profile(注意 PA TH 后面的$PA TH,Linux 下以 “:” 分割,Windows 下以“;” 分割)1.2.3更新系统环境变量#source /etc/profile 或重启。
电脑mac地址查询方法电脑MAC地址查询方法。
电脑的MAC地址是唯一的硬件地址,用于在局域网中标识网络设备。
如果你需要查询电脑的MAC地址,可以通过以下几种方法来实现。
1.通过命令提示符查询。
在Windows操作系统中,可以通过命令提示符来查询电脑的MAC地址。
首先,点击开始菜单,输入“cmd”打开命令提示符窗口。
然后在命令提示符中输入“ipconfig /all”,并按下回车键。
在显示的信息中,可以找到“物理地址”一栏,后面的数值就是电脑的MAC地址。
2.通过网络连接属性查询。
另一种查询MAC地址的方法是通过网络连接属性。
在Windows操作系统中,可以通过控制面板找到网络连接,右键点击选择“属性”,然后在弹出的窗口中找到“详细信息”或“支持”选项卡,其中包含了MAC地址的信息。
3.通过系统偏好设置查询。
如果你是使用Mac操作系统的用户,可以通过系统偏好设置来查询电脑的MAC地址。
首先点击苹果菜单,选择“系统偏好设置”,然后点击“网络”,在弹出的窗口中选择当前连接的网络,点击“高级”,在“硬件”选项卡中可以找到MAC地址的信息。
4.通过第三方软件查询。
除了以上的方法,还可以通过一些第三方软件来查询电脑的MAC地址。
在互联网上有很多免费的MAC地址查询工具,可以帮助用户快速准确地获取MAC地址信息。
总结。
通过以上几种方法,我们可以轻松地查询到电脑的MAC地址。
不同的操作系统可能有一些细微的差别,但总体来说,都是比较简单直接的。
如果你需要在网络设置或其他应用中使用MAC地址,可以根据以上方法来获取所需的信息。
希望这篇文章对你有所帮助!。
java 获取本机ip的方法Java 获取本机IP的方法介绍在开发Java应用程序时,有时候需要获取本机的IP地址。
本文将介绍几种获取本机IP的方法。
方法一:通过InetAddress类获取使用Java的InetAddress类可以获取到本机的IP地址。
以下是获取本机IP的代码片段:import ;import ;public class IPAddressExample {public static void main(String[] args) {try {InetAddress address = ();("IP Address: " + ());} catch (UnknownHostException e) {();}}}方法二:通过NetworkInterface类获取另一种获取本机IP地址的方法是使用Java的NetworkInterface 类。
以下是具体的代码示例:import ;import ;import ;import ;public class IPAddressExample {public static void main(String[] args) {try {Enumeration<NetworkInterface> networkInterfa ces = ();while (()) {NetworkInterface networkInterface = (); Enumeration<InetAddress> inetAddresses = ();while (()) {InetAddress address = ();if (!() && ()) {("IP Address: " + ());}}}} catch (SocketException e) {();}}}方法三:通过System类获取Java的System类提供了一个systemProperties变量,它包含一些系统相关的属性,其中就包括本机的IP地址。
在网络和软件开发领域,获取客户端机器码是一项常见的任务。
在Java编程中,我们也经常会遇到这样的需求,需要获取客户端机器码来进行识别、验证或其他操作。
那么,在Java中,我们该如何获取客户端机器码呢?本文将从深度和广度两个方面来探讨这个主题。
1. 基本概念我们需要了解客户端机器码的基本概念。
客户端机器码通常是指客户端设备的唯一标识,它可以用于识别客户端设备或验证客户端的合法性。
通常情况下,客户端机器码是由客户端设备的硬件或软件信息计算而来的,具有唯一性和不可变性。
2. Java中的实现在Java中,获取客户端机器码的方法有很多种,我们可以根据具体的需求来选择合适的方法。
常见的方法包括获取MAC位置区域、获取硬件信息、获取系统信息等。
在以下内容中,我将逐一介绍这些方法,并分析它们的优缺点。
2.1 获取MAC位置区域MAC位置区域是网卡设备的唯一标识,可以用于识别设备。
在Java 中,我们可以通过调用操作系统的命令来获取MAC位置区域,然后进行处理和格式化,最终得到客户端的机器码。
2.2 获取硬件信息除了MAC位置区域外,我们还可以通过获取客户端设备的硬件信息来生成机器码。
这些硬件信息可以包括CPU型号、硬盘序列号、主板型号等。
通过这些信息的组合,我们可以得到一个较为唯一的机器码。
2.3 获取系统信息获取客户端设备的系统信息也是一种常见的方法。
这包括操作系统版本、系统语言、时区等信息。
这些信息的组合可能会更加唯一和具有区分度。
3. 个人观点与理解在实际应用中,选择合适的方法来获取客户端机器码非常重要。
我们需要根据具体的业务需求、安全性考量和用户隐私保护等方面来综合考虑。
我们还需要注意到,客户端机器码可能受到用户干预、设备更换或者虚拟化环境的影响,这也需要我们在设计和使用时加以考虑。
4. 总结获取客户端机器码在Java开发中是一项具有挑战性的任务。
我们需要根据具体需求选择合适的方法,并在实际应用中注意到安全性和合法性的问题。
方法一:通过NetBIOS[Ne tbios is not support ed on Windows Vista, Windows Server 2008, and subsequent ver sions of the operati ng system]#include <windows.h>#pragma comment(lib, "Netap i32.lib")namespace{bool GetAdapterIn fo(int adapterNum, s td::string& macOUT){NCB Ncb;memset(&N cb, 0, sizeof(Ncb));Ncb.ncb_command = N CBRESET; // 重置网卡,以便我们可以查询Ncb.ncb_lana_n um = adapterNum;if(Netbios(&Ncb) != NR C_GOODRET)return fa lse;// 准备取得接口卡的状态块memset(&Ncb, sizeof(Ncb), 0);Ncb.ncb_c ommand = NCBASTAT;N cb.ncb_lana_num = ad apterNum;strcpy((ch ar *) Ncb.ncb_callna me, "*");struct AST AT{ADAPTER_STATUSadapt;NAME_BUFFER n ameBuff[30];}adapte r;memset(&adapter,s izeof(adapter), 0);Ncb.ncb_buffer = (un signed char *)&adapt er;Ncb.ncb_length = sizeof(adapter);if (Netbios(&Ncb) != 0)return false;char acMAC[32];sprintf(acMAC, "%02X-%02X-%02X-%02X-%02X-%02X",int (adapter.adapt.a dapter_address[0]),int (adapter.adapt.a dapter_address[1]),int (adapter.adapt.a dapter_address[2]),int (adapter.adapt.a dapter_address[3]),int (adapter.adapt.a dapter_address[4]),int (adapter.adapt.a dapter_address[5]));macOUT = acMAC;ret urn true;}}boolGetMacByNetBIOS(std::string& macOUT){// 取得网卡列表LANA_ENUM a dapterList;NCB Ncb;memset(&Ncb, 0, siz eof(NCB));Ncb.ncb_c ommand = NCBENUM;Nc b.ncb_buffer = (unsi gned char *)&adapter List;Ncb.ncb_length = sizeof(adapterLis t);Netbios(&Ncb);// 取得MACfor (int i= 0; i < adapterList.length; ++i){if (GetAdapterInfo(adapt na[i], macO UT))return true;}return false;}参考:取得系统中网卡MAC地址的三种方法方法二:通过对控制台ipconfi g /all命令重定向#include <Windows.h>#includ e <boost\regex.hpp>namespace{#if 0/// @brief 采用字符串查找来提取MAC地址/// @remark 该方法有很大局限性,并不是所有OS返回的MA C地址前导字符串都是/// "Physical Address. .. . . . . . . : "bo ol ParseMac(const st d::string& str, std::string& macOUT){s tatic const std::str ing beginMarkOfMAC("Physical Address. .. . . . . . . : ");static const std::st ring endMarkOfMAC("\r\n");size_t begin= str.find(beginMark OfMAC);if(begin !=std::string::npos){begin += beginMarkO fMAC.size();size_tend = str.find(endMa rkOfMAC, begin);if(end != std::string::npos){macOUT = str.substr(begin, end - begin - 1);returntrue;}}return fal se;}#else/// @bri ef 采用boost::regex来提取MACbool ParseMac(co nst std::string& str, std::string& macOU T){const static bo ost::regex expressio n("([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-f A-F]{2})-([0-9a-f A-F]{2})",boost::rege x::perl | boost::reg ex::icase);boost::c match what;if(boos t::regex_search(str.c_str(), what, expre ssion)){macOUT =what[1] + "-" + what[2] + "-" + what[3]+ "-" + what[4] + "-" + what[5] + "-" +what[6];return true;}return false;}#endif}bool GetMa cByCmd(std::string&macOUT){bool ret = false;//初始化返回MAC地址缓冲区SECURITY_ATTRIB UTES sa;sa.nLength = sizeof(SECURITY_A TTRIBUTES);sa.lpSe curityDescriptor = N ULL;sa.bInheritHan dle = TRUE;//创建管道HANDLE hReadPipe,hWr itePipe;if(CreatePi pe(&hReadPipe, &hWri tePipe, &sa, 0) == T RUE){//控制命令行窗口信息S TARTUPINFO si;//返回进程信息PROCESS_INFORMA TION pi;si.cb = siz eof(STARTUPINFO);G etStartupInfo(&si);si.hStdError = hWri tePipe;si.hStdOutp ut = hWritePipe;si.wShowWindow = SW_HI DE; //隐藏命令行窗口si.dwF lags = STARTF_USESHO WWINDOW | STARTF_USE STDHANDLES;//创建获取命令行进程if (CreateProce ss(NULL, "ipconfig /all", NULL, NULL, TR UE, 0, NULL, NULL, &si, &pi) == TRUE){WaitForSingleObjec t(pi.hProcess, 3000); // 设置超时时间,防止Vista、Win7等操作系统卡死unsigned long count;CloseHa ndle(hWritePipe);st d::string strBuffer(1024 * 10, '\0'); //准备足够大的缓冲区if(ReadFi le(hReadPipe, const_cast<char*>(strBuffe r.data()), strBuffer.size() - 1, &count, 0) == TRUE){strBu ffer.resize(strBuffe r.find_first_of('\0')); // 截掉缓冲区后面多余的'\0'ret = ParseMac(str Buffer, macOUT);//提取MAC地址串}CloseHandle(pi.hThread);Close Handle(pi.hProcess);}CloseHandle(hWri tePipe); // VS2010下调试,此处会有“An invalid ha ndle was specified”的中断,直接运行正常,原因未知。
用纯JAVA语言编程读取MAC地址的实现本文介绍如何在WindowXP/NT/2000环境中,编写纯Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址的编程方法。
1 引言用Java编写的程序,可以很方便地运行在各种平台的环境。
但在实际的开发过程中,有时不得不涉及一些底层的编程。
比如为了防止软件盗用,我们希望软件只能在指定计算机上运行,所以需要程序读取该机区分于其它计算机的硬件特征,如MAC地址等。
作为一种跨平台语言,给Java语言提出了挑战。
本文正是针对该问题,提出一种直接用纯Java语言,读去MAC地址的编程方法。
我们知道,在每一个Java应用程序中都存在着一个与其运行环境相联系的Runtime对象。
该对象可执行外部命令、查可用内存等。
而多数操作系统都提供有查询该机MAC地址的命令。
如在Microsoft的操作系统中,命令IPCONFIG等。
本文的思路是在程序中运行一个外部命令,将该命令的运行结果作为一个流(Stream),读取并分析之,进而实现获取MAC地址的目的。
2 Runtime类在每一个Java 应用程序里面,都有惟一的一个Runtime 对象。
通过这个Runtime 对象,应用程序可以与其运行环境发生相互作用。
一般不实例化一个Runtime对象。
但是可以通过调用静态方法Runtime.getRuntime( )而获得对当前Runtime对象的引用。
Runtime 类的大多数方法是实例方法。
Runtime 对象的作用主要有:执行外部命令;返回空闲内存;运行垃圾回收器;加载动态库等。
Applets和其他不可信赖的程序由于没有引起一个安全异常(SecurityException)而不能调用任何的Runtime方法。
下面的例子演示了怎样使用Runtime 对象运行一个外部命令。
以下是引用片段::Process process = Runtime.getRuntime().exec("cmd.exe /c dir");process.waitFor();:Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
通过Process可以控制该子进程的执行或获取该子进程的信息。
第二条语句的目的是等待子进程完成后再往下执行。
上面的程序在运行时会执行dir命令。
如果在Windows95/98下,命令格式可以写成"command.exe /c dir"。
开关/C指明后面跟随的字符串是命令,并在执行命令后关闭DOS 窗口。
方法exec还可以打开一个不可执行的程序,但该文件存在关联的应用程序。
以打开一个word文档Mydoc.doc文件为例,Java中可以有以下两种写法:以下是引用片段:exec(""cmd /E:ON /c start MyDoc.doc"");exec(" c:Program FilesMicrosoft Officeofficewinword.exe .mydoc.doc" );在第一种方式中,被执行的命令是start Mydoc.doc,开关E:ON 指定DOS 命令处理器允许命令扩展,而start 命令会开启一个单独的窗口执行所提供的命令。
执行一个有标准输出的DOS命令,程序执行完后往往不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。
导致该现象的原因可能是该命令的输出比较多,而运行窗口的输出缓冲区不够大。
解决的办法是,利用Java的Process类提供的方法让Java虚拟机截获DOS运行的标准输出,在waitfor()命令之前读出该缓冲区的内容。
以运行命令dir为例,典型的程序如下:以下是引用片段::String line;Process process = Runtime.getRuntime().exec("cmd /c dir");BufferedReader bufferedReader = new BufferedReader ( new InputStrea mReader(process.getInputStream()));while ( (line = bufferedReader.readLine()) != -1) System. out.println(line);process.waitFor( );:3 ProcessRuntime.exec方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。
抽象类Process封装了一个进程(process),一个正在执行的程序。
它主要被当作由Runtime类中的exec( )方法所创建的对象的类型的超类。
在抽象类Process中,主要包含了如下一些抽象方法。
InputStream getInputStream( ):返回一个从进程的out输出流中读输入的输入流。
OutputStream getOutputStream( ):返回一个从进程的in输入流中写输出的输出流。
int waitFor( ) throws InterruptedException:返回由进程返回的退出码。
这个方法直到调用它的进程中止,才会返回。
4 程序编写我们先来分析ipconfig/all的输出格式:图1从图1中我们看到MAC地址包含的行为:“ Physical Address. . . . . . . . . : 00-10-DC-A9-0B-2C”。
为了找到MAC地址,我们一行一行读取字符,只要找到字符串“ Physical Address. . . . . . . . . :”,就可以找到MAC地址了。
下面是实现的程序片段:以下是引用片段::Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all") ;BufferedReader bufferedReader =new BufferedReader(new InputStreamReader (process.getInputStream()) );while ( (line=bufferedReader.readLine()) != null){if(line.indexOf("Physical Address. . . . . . . . . :") != -1){ if(line.indexOf(":") != -1){physicalAddress = line.substring(line.indexOf(":")+2);:在上面的程序中,为了读取命令输出的字符,利用子进程process生成了一个数据流缓冲区。
依据上面的代码,我们编写了一个类ReadMAC,见下面程序的源代码:以下是引用片段:import java.io.*;public class ReadMAC {public static String physicalAddress = "read MAC error!";public ReadMAC() {}public static String checkPhysicalAddress(){try{String line;Process process = Runtime.getRuntime().exec("cmd /c ipconfig /all") ;BufferedReader bufferedReader = new BufferedReader(new InputStreamR eader(process.getInputStream()));while ( (line=bufferedReader.readLine()) != null){if(line.indexOf("Physical Address. . . . . . . . . :") != -1){ if(line.indexOf(":") != -1){physicalAddress = line.substring(line.indexOf(":")+2);break; //找到MAC,推出循环}}}process.waitFor();}catch(Exception e){e.printStackTrace();}return physicalAddress;}public static void main(String[] args) {System.out.println("本机的MAC地址是: "+ ReadMAC.checkPhysicalAddress());}}编译运行该程序的输出结果如图2所示。
图2由于每一台计算机的MAC地址都不同,所以该程序在不同计算机上运行结果都会不一样。
5 结束语作为一个跨平台语言,编写的JAVA程序一般都与硬件无关,因而能运行在不同的操作系统环境。
但这给编写底层相关的程序时带来不便。
Java的应用程序都存在着一个与其运行环境相联系的Runtime对象,利用该对象可执行外部命令,在WindowsXP/NT/2000环境中的命令IPCONFIG的输出包含有MAC地址。
本文编写的Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址。
由于IPCONFIG命令是操作系统命令,所以该方法既方便又可靠。
以上讨论的程序适合于Windows XP/NT/2000操作系统,因为它是基于该操作系统的命令IPCONFIG格式的。
由于不同操作系统读取MAC地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。
要移植到其它系统只需针对命令的输出格式稍作修改。