JAVA实现获取MAC地址
java获取当前接口请求路径的几种方法
![java获取当前接口请求路径的几种方法](https://img.taocdn.com/s3/m/5f009804b207e87101f69e3143323968011cf433.png)
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对象获取请求路径。
java 根据IP获取客户端Mac地址
![java 根据IP获取客户端Mac地址](https://img.taocdn.com/s3/m/b47229a1b0717fd5360cdc88.png)
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 获取路径](https://img.taocdn.com/s3/m/ebc9e067ce84b9d528ea81c758f5f61fb73628ac.png)
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获取浏览器端MAC地址
![Java获取浏览器端MAC地址](https://img.taocdn.com/s3/m/eb6bb50579563c1ec5da71da.png)
String str = ""; String macAddress = ""; try {
Process p = Runtime.getRuntime().exec("nbtstat -A " + ip); InputStreamReader ir = new InputStreamReader(p.getInputStream()); LineNumberReader input = new LineNumberReader(ir); for (int i = 1; i < 100; i++) {
//所以又第二个 if 判断 你可先在你机器上 cmd 测试下 nbtstat -A 命令 当然得有 一个你可以 ping 通的 //网络 ip 地址,然后根据你得到的结果中 mac 地址显示方式来确定这个循环取值
} } } catch (IOException e) { e.printStackTrace(System.out); } return macAddress; } 附: 通过代理了的客户端 ip 地址获取方式 于是可得出获得客户端真实 IP 地址的方法一: public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); }
JAVA如何获取客户端IP地址和MAC地址
![JAVA如何获取客户端IP地址和MAC地址](https://img.taocdn.com/s3/m/323ffc93e43a580216fc700abb68a98271feac64.png)
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地址的方法](https://img.taocdn.com/s3/m/846546fbba4cf7ec4afe04a1b0717fd5360cb2c7.png)
查看mac地址的方法
要查看MAC地址,可以按照以下步骤进行操作:
1. 在Mac电脑上,点击屏幕左上角的"苹果"图标。
2. 从下拉菜单中选择“系统偏好设置”。
3. 在系统偏好设置窗口中,找到并点击“网络”选项。
4. 在网络设置窗口左侧的列表中,选择你当前正在使用的网络类型(Wi-Fi、以太网等)。
5. 在右侧窗口中,点击“高级”按钮。
6. 在弹出的高级设置窗口中,选择“硬件”标签。
7. 在“硬件地址”一栏中,就是你的MAC地址。
这个地址通常由十六进制数表示,由六个双字节组成,每个双字节用两个冒号(:)分隔。
例如,00:11:22:33:44:55。
JAVA实现获取MAC地址
![JAVA实现获取MAC地址](https://img.taocdn.com/s3/m/b9213fb7bb0d4a7302768e9951e79b896902685f.png)
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地址
![如何获取本机电脑的mac地址](https://img.taocdn.com/s3/m/3beb5c0c03d8ce2f00662375.png)
如何获取本机电脑的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的方法](https://img.taocdn.com/s3/m/bbca4e18abea998fcc22bcd126fff705cc175c01.png)
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地址
![java实现获取用户的MAC地址](https://img.taocdn.com/s3/m/1b3ab10db6360b4c2e3f5727a5e9856a561226b0.png)
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地址。
java获取ip的方法
![java获取ip的方法](https://img.taocdn.com/s3/m/90c4ce15b5daa58da0116c175f0e7cd185251870.png)
(原创实用版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学习总结](https://img.taocdn.com/s3/m/8c8b5c6925c52cc58bd6bef2.png)
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地址查询方法](https://img.taocdn.com/s3/m/007b6c5f15791711cc7931b765ce0508763275e3.png)
电脑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的方法](https://img.taocdn.com/s3/m/6463cecc9f3143323968011ca300a6c30c22f11c.png)
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获取客户端机器码的方法](https://img.taocdn.com/s3/m/15c6a361580102020740be1e650e52ea5518ce18.png)
在网络和软件开发领域,获取客户端机器码是一项常见的任务。
在Java编程中,我们也经常会遇到这样的需求,需要获取客户端机器码来进行识别、验证或其他操作。
那么,在Java中,我们该如何获取客户端机器码呢?本文将从深度和广度两个方面来探讨这个主题。
1. 基本概念我们需要了解客户端机器码的基本概念。
客户端机器码通常是指客户端设备的唯一标识,它可以用于识别客户端设备或验证客户端的合法性。
通常情况下,客户端机器码是由客户端设备的硬件或软件信息计算而来的,具有唯一性和不可变性。
2. Java中的实现在Java中,获取客户端机器码的方法有很多种,我们可以根据具体的需求来选择合适的方法。
常见的方法包括获取MAC位置区域、获取硬件信息、获取系统信息等。
在以下内容中,我将逐一介绍这些方法,并分析它们的优缺点。
2.1 获取MAC位置区域MAC位置区域是网卡设备的唯一标识,可以用于识别设备。
在Java 中,我们可以通过调用操作系统的命令来获取MAC位置区域,然后进行处理和格式化,最终得到客户端的机器码。
2.2 获取硬件信息除了MAC位置区域外,我们还可以通过获取客户端设备的硬件信息来生成机器码。
这些硬件信息可以包括CPU型号、硬盘序列号、主板型号等。
通过这些信息的组合,我们可以得到一个较为唯一的机器码。
2.3 获取系统信息获取客户端设备的系统信息也是一种常见的方法。
这包括操作系统版本、系统语言、时区等信息。
这些信息的组合可能会更加唯一和具有区分度。
3. 个人观点与理解在实际应用中,选择合适的方法来获取客户端机器码非常重要。
我们需要根据具体的业务需求、安全性考量和用户隐私保护等方面来综合考虑。
我们还需要注意到,客户端机器码可能受到用户干预、设备更换或者虚拟化环境的影响,这也需要我们在设计和使用时加以考虑。
4. 总结获取客户端机器码在Java开发中是一项具有挑战性的任务。
我们需要根据具体需求选择合适的方法,并在实际应用中注意到安全性和合法性的问题。
获取mac地址的几种方法
![获取mac地址的几种方法](https://img.taocdn.com/s3/m/30ae10e805a1b0717fd5360cba1aa81144318f08.png)
方法一:通过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取主机IP及机器码
![java取主机IP及机器码](https://img.taocdn.com/s3/m/e535a7c18bd63186bcebbcf0.png)
}
return null;
}
public static String getLocalIP ()
{
String ip = "";
ip = address.nextElement();
System.out.println(ni.getName() + ";" + ip.getHostAddress()
+ ";ip.isSiteLocalAddress()="
+ ip.isSiteLocalAddress()
}
return ip;
}
/* 一个将字节转化为十六进制ASSIC码的函数 */
public static String byteHEX (byte ib)
{
char[] Digit =
netip = ip.getHostAddress();
finded = true;
break;
} else if (ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress()
&& ip.getHostAddress().indexOf(":") == -1) {// 内网IP
}
}
}
catch (SocketException e)
{
e.printStackTrace ();
System.exit (-1);
return builder.toString();
mac系统下载、安装、使用Java8教程
![mac系统下载、安装、使用Java8教程](https://img.taocdn.com/s3/m/017fb8d04128915f804d2b160b4e767f5acf8009.png)
mac系统下载、安装、使⽤Java8教程1.下载jdk81)官⽹下载地址Java8下载官⽹地址:注:以下内容基于macOS系统平台版本:macOS 10.12.62)下载mac对应的jdk3)未登录授权的情况下会弹出提⽰框4)解决弹框问题,先注册oracle账号,然后登录5)登录后,勾选协议,位置如图6)最后下载完成。
2.安装jdk1)jdk安装⽂件2)双击pkg,按提⽰流程安装3)安装成功3.确定jdk安装完整1)打开终端窗⼝按快捷键command+空格,然后输⼊ter搜索找终端:2)查看安装位置打开终端窗⼝,执⾏命令:/usr/libexec/java_home -VNote:图中说明当前 jdk 版本是java 8 版本。
3)确定jdk安装完整执⾏命令:ls -l /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/确保下⾯有 javac 、javap,也就确保 jdk 安装完全。
查看安装状态.png 4.安装JDK后需要配置JDK的环境变量 1)打开终端窗⼝,打开基础配置⽂件若第⼀次配置环境变量,使⽤“touch .bash_profile” 创建⼀个.bash_profile的隐藏配置⽂件。
若配置⽂件.bash_profile已存在,则直接使⽤"open -e .bash_profile"命令,打开配置⽂件。
2)在配置⽂件中配置java环境变量配置代码如下:JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/HomePATH=$JAVA_HOME/bin:$PATH:.CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.export JAVA_HOMEexport PATHexport CLASSPATH3)使配置⽣效:source .bash_profile查看java版本:java -version4)成功配置jdk:javacNote:系统会输出 javac 的帮助信息。
关于网站javalicense单机授权认证的见解
![关于网站javalicense单机授权认证的见解](https://img.taocdn.com/s3/m/afd547e8aff8941ea76e58fafab069dc502247b5.png)
关于⽹站javalicense单机授权认证的见解 在给客户公司开发⽹站往往需要进⾏⼀个授权认证机制防⽌知识产权被侵犯。
我就讲讲在最近⼀个项⽬中⽤到的授权机制,⼀直想整理⼀下做个总结但都没有⼀个合适的时间段,今天我就详细说说我怎么实现的欢迎⼤家指正漏洞哦。
⼀、背景:单机实现认证过程,也就是通过读取⼀个⽂件(xxx.lic)来判断是否认证过。
产品类似桌⾯应⽤需要安装包,客户要想使⽤该产品装完产品后第⼀次打开时是需要完成⼀个授权认证的(需要读取上⾯说的xxx.lic⽂件)。
该⽂件的产⽣是由开发者公司提供,可设置使⽤期限。
⼆、所⽤到的技术:RSA⾮对称加密和MD5算法。
三、说明:RSA算法只⽤到其中的数字签名为了防⽌⽂件被恶意篡改,主要的认证信息还是⽤到的MD5加密。
因为是单机授权没有必要使⽤RSA的加密算法,只是为了保证⼀个授权⽂件只能在⼀台电脑上使⽤⼀个MD5就够了(MD5中也可以加⼊⾃⼰的算法)。
主要是获取电脑的cpu序列号,mac 地址硬盘序列号等信息作为唯⼀标识进⾏认证可设置授权的开始时间和结束时间来验证是否过期。
下⾯直接上代码吧,欢迎指正。
1、⾸先是加密解密类 RSATester.javaimport java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;import java.util.Properties;import com.alibaba.fastjson.JSONObject;/*** @className: RSATester* @description: RSA 加密解密类* @author: yjb* @createTime: 2017-12-01 下午10:03:44*/public class RSATester {static String publicKey;static String privateKey;static {try {Map<String, Object> keyMap = RSAUtils.genKeyPair();publicKey = RSAUtils.getPublicKey(keyMap);privateKey = RSAUtils.getPrivateKey(keyMap);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {test();// licenseCheck();// getConfig("");}/*** 公钥加密——私钥解密** @throws Exception*/static void test() throws Exception {System.err.println("公钥加密——私钥解密");Date endtime = null;String str1 = "";String str2 = "";String str22 = "";String str2type = "";String str3 = "";Boolean status = true;// 明⽂SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");while (true) {System.out.println("请输⼊授权类型 1 or 2 : 1、客户端 2、服务端");str3 = SystemTool.ReadTest();if ("1".equals(str3) || "2".equals(str3)) {break;} else {System.out.println("您输⼊的授权类型有误,请重新输⼊");continue;}}// System.out.println("请输⼊授权过期⽇期:格式如:2017-12-01 12:30:30");while (status) {System.out.println("请选择授权过期⽇期:1、⼀个⽉ 2、三个⽉ 3、六个⽉ 4、⼀年 5、三年 6、⾃定义⽇期"); str2type = SystemTool.ReadTest();str1 = df.format(new Date());if ("1".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 30);break;} else if ("2".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 90);break;} else if ("3".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 180);break;} else if ("4".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 365);break;} else if ("5".equals(str2type)) {endtime = SystemTool.getSomeDay(new Date(), 1095);break;} else if ("6".equals(str2type)) {System.out.println("请输⼊⾃定义⽇期格式如:2017-12-01 12:30:30");str22 = SystemTool.ReadTest();break;} else {System.out.println("您输⼊的授权过期⽇期类型有误,请重新出⼊");continue;}}if ("6".equals(str2type)) {str2 = str22;} else {str2 = df.format(endtime);}// String machineCode=SystemTool.getMachineCode();//MD5加密的机器码System.out.println("请输⼊机器码:");String machineCode = SystemTool.ReadTest();JSONObject localJSONObject = new JSONObject();localJSONObject.put("starttime", str1);localJSONObject.put("endtime", str2);localJSONObject.put("lictype", str3);localJSONObject.put("machinecode", machineCode);String source = localJSONObject.toString();System.out.println("\r加密前⽂字:\r\n" + source);byte[] data = source.getBytes();// byte[] encodedData = RSAUtils.encryptByPublicKey(data, publicKey);byte[] encodedData = RSAUtils.encryptByPrivateKey(data, privateKey);String encodedDatastr = bytesToString(encodedData);// System.out.println("加密后⽂字:\r\n" + new String(encodedData));// System.out.println("加密后经转换格式后的数据:\r\n" + encodedDatastr);// 签名// System.err.println("私钥签名——公钥验证签名");String sign = RSAUtils.sign(encodedData, privateKey);// System.err.println("签名:\r" + sign);// 写⼊本地的内容签名 + 加密后的密⽂String content = publicKey+ "$$" + sign + encodedDatastr;// ⽣成认证⽂件String path = SystemTool.getProjectPath();File localFile2 = new File(path + "\\xxx.lic");if (localFile2.exists())localFile2.delete();PrintWriter localPrintWriter2 = new PrintWriter(new OutputStreamWriter(new FileOutputStream(localFile2)), true); localPrintWriter2.println(content);localPrintWriter2.close();System.out.println("xxx.lic ⽣成成功!⽬录:" + path);}public static String bytesToString(byte[] arr) {StringBuffer sb = new StringBuffer();for (int i = 0; i < arr.length; i++) {if (i == 0) {sb.append(arr[i]);} else {sb.append("|").append(arr[i]);}}return sb.toString();}public static byte[] stringToBytes(String str) {String[] arr = str.split("\\|");byte[] bytes = new byte[arr.length];arr[arr.length - 1] = arr[arr.length - 1].trim();for (int i = 0; i < arr.length; i++) {bytes[i] = Byte.valueOf(arr[i]);}return bytes;}/*** 单机验证授权解析授权⽂件 xxx.lic** @return* @throws WDKException*/public static boolean licenseCheck() {try {String path = SystemTool.getProjectPath();File localFile = new File(path + "\xxx.lic");if (localFile.exists()) {byte[] arrayOfByte = new byte[Integer.parseInt(Long.toString(localFile.length()))];FileInputStream localFileInputStream = new FileInputStream(localFile);localFileInputStream.read(arrayOfByte);localFileInputStream.close();String str = new String(arrayOfByte);// System.out.println("读取⽂件内容:" + str);String decodedData1 = "";String sign = "";String publickey2 = "";if (str.indexOf("$$") != -1) {sign = str.substring(str.indexOf("$$") + 2, str.indexOf("=") + 1);// 签名publickey2 = str.substring(0, str.indexOf("$$"));// 公钥} else {System.out.println("授权⽂件已被修改,如需继续使⽤本软件请重新进⾏授权");return false;}if (str.indexOf("=") != -1) {decodedData1 = str.substring(str.indexOf("=") + 1, str.length() - 1);// 密⽂} else {System.out.println("授权⽂件已被修改,如需继续使⽤本软件请重新进⾏授权");return false;}// System.out.println("解析后的公钥:" + publickey2);byte[] data2 = stringToBytes(decodedData1);// 解析后的密⽂(已加密数据)// 签名验证System.out.println("开始验证签名——————————————————————————————————"); // System.out.println("解析后的签名:" + sign);boolean status = RSAUtils.verify(data2, publickey2, sign);System.err.println("签名验证结果:\r" + status);if (status) {// 签名通过// 解密JSONObject localJSONObject = new JSONObject();long LIC_Frame_endtime;System.out.println("开始解密——————————————————————————————————"); byte[] decodedData = RSAUtils.decryptByPublicKey(data2, publickey2);String target = new String(decodedData); // 明⽂// System.out.println("解密后: \r\n" + target);SimpleDateFormat localSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");localJSONObject = (JSONObject) JSONObject.parse(target);String lictype = localJSONObject.getString("lictype");String machinecode = localJSONObject.getString("machinecode");String endtime = localJSONObject.getString("endtime");String starttime = localJSONObject.getString("starttime");if (SystemTool.ver_MacineCode(machinecode)) {// 机器验证通过if ("1".equals(lictype)) {if ((null == endtime) || ("".equals(endtime))) {LIC_Frame_endtime = 0L;} else {LIC_Frame_endtime = ((Date) localSimpleDateFormat.parseObject(endtime)).getTime();boolean bool = RSAUtils.verifyendTime(LIC_Frame_endtime);// 校验是否过期System.out.println("授权到期时间:" + endtime);System.err.println("授权验证结果:\r" + bool);if (!bool) {System.out.println("授权信息已过期,请重新授权!!");return false;}}} else {System.out.println("授权⽂件类型不正确,请重新授权");return false;}} else {System.out.println("机器码验证失败,请重新授权");return false;}} else {System.out.println("签名验证失败,请重新授权!!");return false;}} else {System.out.println(path + "未发现授权⽂件xxx.lic,请检查...");return false;}} catch (Exception localException) {System.out.println("授权⽂件xxx.lic解析失败...");return false;}return true;}}2、下⾯是⼀个⼯具类 SystemTool.javaimport java.io.BufferedReader;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .InetAddress;import workInterface;import .SocketException;import .URLDecoder;import .UnknownHostException;import java.security.NoSuchAlgorithmException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.eclipse.swt.SWT;import yout.GridData;import org.eclipse.swt.widgets.DateTime;/*** @className: SystemTool* @description: 与系统相关的⼀些常⽤⼯具⽅法. ⽬前实现的有:获取MAC地址、IP地址、C硬盘序列号* @author: yjb* @createTime: 2017-12-01 下午10:03:44*/public class SystemTool {/*** 获取当前操作系统名称. return 操作系统名称例如:windows xp,linux 等.*/public static String getOSName() {return System.getProperty("").toLowerCase();}/*** ⽣成加过密的机器码机器码组成:mac物理地址,本机cpu 序列号 C硬盘序列号* @return* @throws IOException* @throws NoSuchAlgorithmException*/public static String getMachineCode() throws IOException, NoSuchAlgorithmException{String str4=getMAC();// mac物理地址String str5=getCpuNumber();//本机cpu 序列号String str6=getSerialNumber("C");//C硬盘序列号String MachineCode= str4+str5+str6;String md5=EncoderByMd5(MachineCode);//md5加密return md5;}/*** 对机器码进⾏MD5加密* @return* @throws IOException* @throws NoSuchAlgorithmException*/public static String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //确定计算⽅法MessageDigest md5=MessageDigest.getInstance("MD5");BASE64Encoder base64en = new BASE64Encoder();//加密后的字符串String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));return newstr;}/*** 验证机器码* @param str 数据源值* @return* @throws NoSuchAlgorithmException* @throws IOException*/public static Boolean ver_MacineCode(String str) throws NoSuchAlgorithmException, IOException {if(str.equals(getMachineCode())){return true;}return false;}/*** mac物理地址* @return*/public static String getMAC() {String os =getOSName();String mac = "";// System.out.println("OS Type:" + os);if (os.startsWith("windows")) {// 本地是windowsmac = getWindowsMACAddress();// System.out.println("MAC Address:" + mac);} else {// 本地是⾮windows系统⼀般就是unixmac = getUnixMACAddress();// System.out.println(mac);}return mac;}/*** 获取unix⽹卡的mac地址. ⾮windows的系统默认调⽤本⽅法获取.如果有特殊系统请继续扩充新的取mac地址⽅法. ** @return mac地址*/public static String getUnixMACAddress() {String mac = null;BufferedReader bufferedReader = null;Process process = null;try {process = Runtime.getRuntime().exec("ifconfig eth0");// linux下的命令,⼀般取eth0作为本地主⽹卡// 显⽰信息中包含有mac地址信息bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line = null;int index = -1;while ((line = bufferedReader.readLine()) != null) {index = line.toLowerCase().indexOf("hwaddr");// 寻找标⽰字符串[hwaddr]if (index >= 0) {// 找到了mac = line.substring(index + "hwaddr".length() + 1).trim();// 取出mac地址并去除2边空格break;}}} catch (IOException e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}} catch (IOException e1) {e1.printStackTrace();}bufferedReader = null;process = null;}return mac;}/*** 获取widnows⽹卡的mac地址.* ⽤模式匹配⽅式查找MAC地址,与操作系统的语⾔⽆关* @return mac地址*/public static String getWindowsMACAddress(){Pattern macPattern = pile(".*((:?[0-9a-f]{2}[-:]){5}[0-9a-f]{2}).*", Pattern.CASE_INSENSITIVE); 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 message = br.readLine();int index = -1;while (message != null) {Matcher matcher = macPattern.matcher(message);if (matcher.matches()) {mac= matcher.group(1).trim();break;// macAddressList.add(matcher.group(1).replaceAll("[-:]",// ""));//去掉MAC中的“-”}/* if ((index = message.indexOf("物理地址")) > 0) {mac = message.substring(index + 36).trim();break;}*/message = br.readLine();}br.close();pro.destroy();} catch (IOException e) {System.out.println("Can't get mac address!");return null;}return mac;}/*** @return 本机主机名*/public static String getHostName() {InetAddress ia = null;try {ia = InetAddress.getLocalHost();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (ia == null) {return "some error..";} elsereturn ia.getHostName();}/*** @return 本机IP 地址*/public static String getIPAddress() {InetAddress ia = null;try {ia = InetAddress.getLocalHost();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (ia == null) {return "some error..";} elsereturn ia.getHostAddress();}/*** @return 本机cpu 序列号* @throws IOException*/public static String getCpuNumber() throws IOException {Process process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" }); process.getOutputStream().close();Scanner sc = new Scanner(process.getInputStream());String property = sc.next();String serial = sc.next();//System.out.println(property + ": " + serial);return serial;}/*** 获取硬盘序列号* @param drive* @return*/public static String getSerialNumber(String drive) {String result = "";try {File file = File.createTempFile("realhowto", ".vbs");file.deleteOnExit();FileWriter fw = new java.io.FileWriter(file);String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"+ "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n"+ "Wscript.Echo objDrive.SerialNumber"; // see notefw.write(vbs);fw.close();Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));String line;while ((line = input.readLine()) != null) {result += line;}input.close();} catch (Exception e) {e.printStackTrace();}return result.trim();}/*** InputStreamReader和BufferedReader⽅法* 优点: 可以获取键盘输⼊的字符串* 缺点: 如何要获取的是int,float等类型的仍然转码*/public static String ReadTest(){System.out.println("Please input Data:");String name = "";InputStreamReader is = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(is);try{name = br.readLine();}catch(IOException e){e.printStackTrace();}return name;}/*** Scanner类中的⽅法* 优点: 可以获取键盘输⼊的字符串* 优点: 有现成的获取int,float等类型数据,⾮常强⼤,也⾮常⽅便*/public static void ScannerTest(){Scanner sc = new Scanner(System.in);System.out.println("ScannerTest, Please Enter Name:");String name = sc.nextLine();System.out.println("ScannerTest, Please Enter Age:");int age = sc.nextInt();System.out.println("ScannerTest, Please Enter Salary:");float salary = sc.nextFloat();System.out.println("Your Information is as below:");System.out.println("Name:" + name +"\n" + "Age:"+age + "\n"+"Salary:"+salary);}/*** @param date* @param day 想要获取的⽇期与传⼊⽇期的差值⽐如想要获取传⼊⽇期前四天的⽇期 day=-4即可 * @return*/public static Date getSomeDay(Date date, int day){Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DATE, day);return calendar.getTime();}/*** 取⼯程绝对路径如 e://* @return*/public static String getProjectPath() {try {return URLDecoder.decode(System.getProperty("user.dir"), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return System.getProperty("user.dir").replace("20%", " ");}/*** 测试⽤的main⽅法.** @param argc* 运⾏参数.* @throws Exception*/public static void main(String[] argc) throws Exception {getSomeDay(new Date(),60);//getWindowsMACAddress();}}3、然后是⼀个 RSA 的⼯具类 RSAUtils.javaimport java.io.ByteArrayOutputStream;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;/** *//*** <p>* RSA公钥/私钥/签名⼯具包* </p>* <p>* 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman) * </p>* <p>* 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>* 由于⾮对称加密速度极其缓慢,⼀般⽂件不使⽤它来加密⽽是使⽤对称加密,<br/>* ⾮对称加密算法可以⽤来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全* </p>** @author IceWee* @date 2012-4-26* @version 1.0*/public class RSAUtils {/** *//*** 加密算法RSA*/public static final String KEY_ALGORITHM = "RSA";/** *//*** 签名算法*/public static final String SIGNATURE_ALGORITHM = "MD5withRSA";/** *//*** 获取公钥的key*/private static final String PUBLIC_KEY = "RSAPublicKey";/** *//*** 获取私钥的key*/private static final String PRIVATE_KEY = "RSAPrivateKey";/** *//*** RSA最⼤加密明⽂⼤⼩*/private static final int MAX_ENCRYPT_BLOCK = 117;/** *//*** RSA最⼤解密密⽂⼤⼩*/private static final int MAX_DECRYPT_BLOCK = 128;/** *//*** <p>* ⽣成密钥对(公钥和私钥)* </p>** @return* @throws Exception*/public static Map<String, Object> genKeyPair() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/** *//*** <p>* ⽤私钥对信息⽣成数字签名* </p>** @param data 已加密数据* @param privateKey 私钥(BASE64编码)** @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {byte[] keyBytes = Base64Utils.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(privateK);signature.update(data);return Base64Utils.encode(signature.sign());}/*** <p>* 校验数字签名* </p>** @param data 已加密数据* @param publicKey 公钥(BASE64编码)* @param sign 数字签名** @return* @throws Exception**/public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {byte[] keyBytes = Base64Utils.decode(publicKey);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicK = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(publicK);signature.update(data);return signature.verify(Base64Utils.decode(sign));}/**** 私钥解密*** @param encryptedData 已加密数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)throws Exception {byte[] keyBytes = Base64Utils.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateK);int inputLen = encryptedData.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();return decryptedData;}/**** 公钥解密*** @param encryptedData 已加密数据* @param publicKey 公钥(BASE64编码)* @return* @throws Exception*/public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)throws Exception {byte[] keyBytes = Base64Utils.decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicK = keyFactory.generatePublic(x509KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicK);int inputLen = encryptedData.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();return decryptedData;}/**** 公钥加密*** @param data 源数据* @param publicKey 公钥(BASE64编码)* @return* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data, String publicKey)throws Exception {byte[] keyBytes = Base64Utils.decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicK = keyFactory.generatePublic(x509KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}/*** 私钥加密*** @param data 源数据* @param privateKey 私钥(BASE64编码)* @return* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data, String privateKey)throws Exception {byte[] keyBytes = Base64Utils.decode(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}/*** 获取私钥** @param keyMap 密钥对* @return* @throws Exception*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return Base64Utils.encode(key.getEncoded());}/**** 获取公钥** @param keyMap 密钥对* @return* @throws Exception*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return Base64Utils.encode(key.getEncoded());}/* public static String getMachineCode(){Object localObject = null;if (OSinfo.isWindows()) {localObject = new hwWindow();} else if (OSinfo.isLinux()) {localObject = new hwLinux();}String str1 = ((IHadWare)localObject).getCPUSerial();String str2 = ((IHadWare)localObject).getDriverSerial();String str3 = ((IHadWare)localObject).getMacSerial();System.out.println("cpu=" + str1 + " driverserial=" + str2);String str4 = str1 + str2;str4 = uMD5.MD5(str4);return str4;}*//*** 验证机器码* @param paramString* @return* @throws java.text.ParseException*//* public static boolean verifyMachineCode(String paramString){boolean bool = false;String str = HardWare.getMachineCode();System.out.println("【本机机器码】:[" + str + "]");if (str.equals(paramString)) {bool = true;}return bool;}*/public static boolean verifyendTime(Long endtime) throws java.text.ParseException {boolean bool = false;SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str1 = df.format(new Date());long nowtime = ((Date) df.parseObject(str1)).getTime();// System.out.println("当前时间:"+nowtime+"授权时间到期时间:" +endtime);。
java hmacsha256 解密方法
![java hmacsha256 解密方法](https://img.taocdn.com/s3/m/b692111f182e453610661ed9ad51f01dc28157a3.png)
java hmacsha256 解密方法Java中提供了HMAC-SHA256算法的实现,可以用于加密和解密数据。
HMAC-SHA256是一种基于哈希函数的消息认证码算法,它可以确保数据的完整性和真实性,防止数据被篡改或伪造。
在Java中使用HMAC-SHA256算法进行解密,需要使用javax.crypto包中的Mac类。
Mac类是Java Cryptographic Extension (JCE)框架中的一个类,它提供了HMAC算法的实现。
具体的解密过程如下:1. 导入相关的包我们需要导入相关的包,以便使用Mac类。
在Java中,可以使用import关键字来导入需要的包,如下所示:```javaimport javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;```2. 创建Mac对象接下来,我们需要创建一个Mac对象,用于执行HMAC-SHA256算法。
可以使用Mac.getInstance()方法来获取Mac对象,如下所示:```javaMac mac = Mac.getInstance("HmacSHA256");```3. 初始化Mac对象在创建Mac对象之后,需要使用SecretKeySpec类来初始化Mac 对象。
SecretKeySpec类是一个用于包装密钥的类,它可以将密钥包装成一个Key对象,以供Mac对象使用。
具体的初始化过程如下所示:```javaString secretKey = "your_secret_key";byte[] keyBytes = secretKey.getBytes("UTF-8"); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");mac.init(secretKeySpec);```在上面的代码中,我们需要将密钥存储在一个字符串中,然后将其转换成字节数组,并使用UTF-8编码来处理中文字符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用纯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地址的命令、以及命令输出格式的不同,所以该程序不能直接运用到其它系统。
要移植到其它系统只需针对命令的输出格式稍作修改。