java如何从http请求中获取mac(支持PC、手机)

在网上找了很多资料,大部分都比较坑,不是通过dos命令就是用nbtstat -A的方式,后来找到一个有残缺的,大概只能通过web获取
package com.wt.jwzh.common.utils;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**

  • @date 2018年5月22日 下午12:09:13 * */

public class UdpGetClientMacAddr {
private String sRemoteAddr;

private int iRemotePort=137;

private byte[] buffer = new byte[1024];

private DatagramSocket ds=null;

public UdpGetClientMacAddr(String strAddr) throws Exception{  
    sRemoteAddr = strAddr;  
    ds = new DatagramSocket();  
}  

public final DatagramPacket send(final byte[] bytes) throws IOException {  
    DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort);  
    ds.send(dp);  
    return dp;  
}  

public final DatagramPacket receive() throws Exception {  
    DatagramPacket dp = new DatagramPacket(buffer,buffer.length);  
    ds.receive(dp);  
    return dp;  
}  
public byte[] GetQueryCmd() throws Exception {  
    byte[] t_ns = new byte[50];  
    t_ns[0] = 0x00;  
    t_ns[1] = 0x00;  
    t_ns[2] = 0x00;  
    t_ns[3] = 0x10;  
    t_ns[4] = 0x00;  
    t_ns[5] = 0x01;  
    t_ns[6] = 0x00;  
    t_ns[7] = 0x00;  
    t_ns[8] = 0x00;  
    t_ns[9] = 0x00;  
    t_ns[10] = 0x00;  
    t_ns[11] = 0x00;  
    t_ns[12] = 0x20;  
    t_ns[13] = 0x43;  
    t_ns[14] = 0x4B;  

    for(int i = 15; i < 45; i++){  
        t_ns[i] = 0x41;  
    }  
    t_ns[45] = 0x00;  
    t_ns[46] = 0x00;  
    t_ns[47] = 0x21;  
    t_ns[48] = 0x00;  
    t_ns[49] = 0x01;  
    return t_ns;  
}  
public final String GetMacAddr(byte[] brevdata) throws Exception {  
    // 获取计算机名  
    int i = brevdata[56] * 18 + 56;  
    String sAddr="";  
    StringBuffer sb = new StringBuffer(17);  
    // 先从第56字节位置,读出Number Of Names(NetBIOS名字的个数,其中每个NetBIOS Names Info部分占18个字节)  
    // 然后可计算出“Unit ID”字段的位置=56+Number Of Names×18,最后从该位置起连续读取6个字节,就是目的主机的MAC地址。  
    for(int j = 1; j < 7;j++)  
    {  
        sAddr = Integer.toHexString(0xFF & brevdata[i+j]);  
        if(sAddr.length() < 2)  
        {  
            sb.append(0);  
        }  
        sb.append(sAddr.toUpperCase());  
        if(j < 6) sb.append(':');  
    }  
    return sb.toString();  
}  

public final void close() throws Exception {  
    ds.close();  
}  

public final String GetRemoteMacAddr() throws Exception {  
    byte[] bqcmd = GetQueryCmd();  
    send(bqcmd);  
    DatagramPacket dp = receive();  
    String smac = GetMacAddr(dp.getData());  
    close();  
    return smac;  
}  

}
嗯,求正确的获取方式

0

5个回答

你这个是获取同一个局域网的mac,公网上是获取不到终端的mac的,除非通过web 插件本地获取再上传

1
1

这个方法应该也只能获取到内网机器通信的mac地址,如果你web在公网,获取的mac不会是客户端的

1

mac地址只有在局域网里才能获取到,过第三层交换机就获取不到了

0

首先要说的是:本方法可以支持外网机器的mac地址获取。

 import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
* 获取MAC地址
* @author
* 2011-12
*/
public class GetMacAddress {
   public static String callCmd(String[] cmd) { 
     String result = ""; 
     String line = ""; 
     try { 
       Process proc = Runtime.getRuntime().exec(cmd); 
       InputStreamReader is = new InputStreamReader(proc.getInputStream()); 
       BufferedReader br = new BufferedReader (is); 
       while ((line = br.readLine ()) != null) { 
       result += line; 
       } 
     } 
     catch(Exception e) { 
       e.printStackTrace(); 
     } 
     return result; 
   }

   /** 
   * 
   * @param cmd 第一个命令 
   * @param another 第二个命令 
   * @return  第二个命令的执行结果 
   */
   public static String callCmd(String[] cmd,String[] another) { 
     String result = ""; 
     String line = ""; 
     try { 
       Runtime rt = Runtime.getRuntime(); 
       Process proc = rt.exec(cmd); 
       proc.waitFor(); //已经执行完第一个命令,准备执行第二个命令 
       proc = rt.exec(another); 
       InputStreamReader is = new InputStreamReader(proc.getInputStream()); 
       BufferedReader br = new BufferedReader (is); 
       while ((line = br.readLine ()) != null) { 
         result += line; 
       } 
     } 
     catch(Exception e) { 
       e.printStackTrace(); 
     } 
     return result; 
   }



   /** 
   * 
   * @param ip 目标ip,一般在局域网内 
   * @param sourceString 命令处理的结果字符串 
   * @param macSeparator mac分隔符号 
   * @return mac地址,用上面的分隔符号表示 
   */
   public static String filterMacAddress(final String ip, final String sourceString,final String macSeparator) { 
     String result = ""; 
     String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})"; 
     Pattern pattern = Pattern.compile(regExp); 
     Matcher matcher = pattern.matcher(sourceString); 
     while(matcher.find()){ 
       result = matcher.group(1); 
       if(sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher.group(1))) { 
         break; //如果有多个IP,只匹配本IP对应的Mac. 
       } 
     }

     return result; 
   }



   /** 
   * 
   * @param ip 目标ip 
   * @return  Mac Address 
   * 
   */
   public static String getMacInWindows(final String ip){ 
     String result = ""; 
     String[] cmd = { 
         "cmd", 
         "/c", 
         "ping " + ip 
         }; 
     String[] another = { 
         "cmd", 
         "/c", 
         "arp -a"
         }; 

     String cmdResult = callCmd(cmd,another); 
     result = filterMacAddress(ip,cmdResult,"-"); 

     return result; 
   } 

   /** 
   * @param ip 目标ip 
   * @return  Mac Address 
   * 
   */
   public static String getMacInLinux(final String ip){ 
     String result = ""; 
     String[] cmd = { 
         "/bin/sh", 
         "-c", 
         "ping " + ip + " -c 2 && arp -a"
         }; 
     String cmdResult = callCmd(cmd); 
     result = filterMacAddress(ip,cmdResult,":"); 

     return result; 
   } 

   /**
   * 获取MAC地址 
   * @return 返回MAC地址
   */
   public static String getMacAddress(String ip){
     String macAddress = "";
     macAddress = getMacInWindows(ip).trim();
     if(macAddress==null||"".equals(macAddress)){
       macAddress = getMacInLinux(ip).trim();
     }
     return macAddress;
   }

   //做个测试
   public static void main(String[] args) {      
     System.out.println(getMacAddress("220.181.111.148"));
   }

}
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
判断http 请求来自于手机还是PC
首先收集了部分客户端请求头部信息如下 iPhone微信: User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 MicroMessenger/6.2.4 NetType/WIFI Language/en ...
判断http请求来自手机还是pc
/*  * 判断请求来自手机还是pc  */ package com.up.cttf.utils; import javax.servlet.http.HttpServletRequest; public class HttpRequestDeviceUtils {     /**      * Wap网关Via头信息中特有的描述信息      */     private st
获取PC的MAC地址--仅支持IE
Getting MAC Address From Javascript(IE Only)   function showMacAddress(){   var obj = new ActiveXObject("WbemScripting.SWbemLocator"); var s = obj.ConnectServer("."); var properties = s.ExecQu
转移APK从手机到PC和PC到手机
    在移动自动化的生命周期中,有许多情况需要将apk文件从设备传输到计算机,反之亦然。即使使用Appium自动化,也需要在系统上安装apk文件,以便脚本可以将Appium定位到它。您必须注意Appium Automation脚本中的以下语句行:   1 2 3 File classpathRoot = new File(System.get...
JAVA 如何获取手机的MAC地址啊
RT,rnJAVA 如何获取[color=#FF0000]手机[/color]的MAC地址啊rnrn不是电脑的MACrnrn有没高手啊.
从Http请求中获取请求的实际IP地址
    public static String getRemoteIP(HttpServletRequest request) {        String ip =null;        if (ip == null || ip.length() == 0 || &quot;unknown&quot;.equalsIgnoreCase(ip)) {            ip = request.getHea...
java中http请求,获取json数据的代码示例
有些时候会遇到请求http,获取相应的json或者xml数据,今天整理了一点httpClient请求的示例代码。主要是根据相应的http地址,以及相关秘钥,通过HttpClient去发起请求,获取数据然后后台取解析json或者xml。
如何获取http请求的应答
问: I've been working on figuring out how to receive HTTP Headers via a request made with NSURLConnection. Typically a request is made w
java中http请求
最近在做爬虫项目,在浏览器下获取到可以返回json数据的连接,但是使用java.net自带的请求,请求的只有网页源代码,没有json数据,但是在浏览器上可以直接返回json数据。 String urlpath = "http://www.xxxx.xxx/xxx?status=2&xxx=xxxx&xxxx=2&xxxx=120"URL url = new URL(urlpath); Buf
从http请求中获取参数
springmvc, servlet 和 http 日后认真研究, 先记录下常用获取方式 post请求有请求体, get请求只有请求行和请求头,没有请求体 1.  直接从HttpServletRequest获取信息, 多在springmvc的拦截器中获取请求头中的信息, 用于权限校验 public boolean preHandle(HttpServletRequest requ
RestSharp支持Http请求
wince 使用RestSharp 支持Http方式、速度快。还有json包
获取http请求中的请求体的信息
protected String readRequestBody() throws IOException{ String contentEncoding = getRequest().getHeader("Accept-Encoding"); String resStr = null; if (contentEncoding != null &amp;&amp; cont...
如何从DM9000中获取MAC地址
1、DM9000中是否在出厂的时候就已经有一个MAC地址了rn2、如果有,那么怎么获取到这个地址rn3、如果没有,那么我有没有什么别的办法来每次生成一个不同的MAC地址
如何从注册表获取MAC
用GetAdaptersInfo获取不到已经禁用的网卡信息,所以想通过注册表获取,但获取MAC的知识,网上不太好找,找到的也比较混乱(比如他说的注册表情况跟我的不一样)。rn想问问谁比较熟悉,我是XP系统。
周易软件支持PC及手机
手机周易占卦软件,同时支持PC(windows)以及手机(windows mobile) 运行环境:.net compact framework 2.0及以上
java模拟http请求给手机发短信
private static final String SMS_USER = "*****";     private static final String SMS_PWD = "*****";     private static final String SMS_METHOD_SEND = "*****"; /** * 注册的激活码 * @param mobile * @p
如何从HTTP的请求头信息中,判断是一般pc的请求,还是手机端浏览器的wap请求啊?
如:使用curl请求一个地址,会设置Accept\User-Agent\UA-CPU等信息,请问哪个可以区分是手机的wap请求还是一般的PC的请求啊 ?
获取手机MAC地址
/**      * 获取手机MAC地址      * @return      */     public String getLocalMac()     {         String mac = "";         // 获取wifi管理器         WifiManager wifiMng = (WifiManager)getSystemService(Cont
手机mac地址获取。。。
无线网络服务提供商能不能获取手机的mac地址。。。。rnrnrn比如,我通过gprs上网浏览网页。那么提供gprs服务的供应商能获得我的手机mac地址吗?如果可以的话是通过什么方式呢???rnrn谢谢各位;-)
获取手机mac地址
/** * 获取mac地址 * @param cxt * @return */ public static String getPhoneMac(Context cxt) { String macAddress = null; WifiManager wifiMgr = (WifiManager) cxt.getS
获取手机Mac地址
private String getMacAddress(){            String result = "";            WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);            WifiInfo wifiInfo = wifiManager.
获取手机的mac地址
与IP不同,MAC是指连接WIFI使用的无线网卡的物理地址,这个地址是唯一并且不可变更的。 没有开启wifi能够获取到Mac地址只是获取的ip为0,当然wifi未连接状态下是肯定没有IP分配的。具体看看下面: &amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot;/&amp;gt; //在wif...
获取android 手机的mac
获取android 手机的mac
如何使用JAVA请求HTTP
package com.st.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; i...
获取HTTP请求
现在有台设备.向我的服务器发送rn“Get_/page/?type=VALUE_TYPE&deviceid=VALUE_DEVID&devicename=VALUE_DEVNAME&groupname=VALUE_DEVGRPNAME&port=VALUE_PORT&ip=_HTTP/1.1\r\nAccept-Lanuage:_zh-cn\r\nHost:_VALUE_HOST_\r\n\r\n”rnrn我改如何用jsp得到后面的那些参数???rn请高手指点!!rnrn用工具监听tomcat的80端口.上面的数据确实传递过来了.可是改如何获取呢??rnrn急!!!rn在线等~~~~~~~~~~~~
HTTP获取请求地址
HTTP请求中,为了监控和验证访问的合法性,降低风险,有时候需要获取客户端的请求地址。 private String getIpAddress(HttpServletRequest request) { String ip = request.getHeader(&quot;x-forwarded-for&quot;); if (ip == null || ip.length() == 0 |...
Http请求获取返回值
HttpResponseresponse=client.execute(httpPost); //获取响应码 status=response.getStatusLine().getStatusCode(); HttpEntityhttpEntity=response.getEntity(); //将H中返回实体转化为输入流 InputStreamis=...
获取http请求
一个实用vc6.0开发的获取http请求,附源代码,希望对新手有帮助!高手绕行-_-
http 获取mac地址
package cn.com.henry.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; impor
pocket pc中获取手机联系人
谁知道pocket pc中怎样获取手机联系人各个字段的最大容量,因为我要添加联系人,需要知道手机联系人的各个字段的最大限制,当我要添加的内容超过最大限制时添加就会失败,所以这是我要对添加的内容先进行截取,然后再添加。rnrn 请大家帮忙!
【api】请求 http https 拦截 支持PC 移动设备等
作为一名IT工作者,必备的工具可以不能少的,譬如网络请求的监听等 现在利用睡不着的凌晨0点的时间,花两分钟介绍下以前用的很爽的工具 那就睡Fiddler 的工具了。 国外开发的,界面英文的地方较为多,毕竟是一时的工具,最主要是快 好用 那么我将我配置好的工具发出来 放在云盘分享 直接解压就能用了 链接:http://pan.baidu.com/s/1o8EQU3g 密码:
java中发送http请求
HTTP请求粗分为两种,一种是GET请求,一种是POST请求。使用Java发送这两种请求的Source Code大同小异,只是一些参数设置的不同。步骤如下: 通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)设置请求的参数发送请求以输入流的形式获取返回内容关闭输入流 简单的Get请求示例如下: package co
Fiddler抓取手机http请求
Fildder下载:http://www.cr173.com/soft/57378.html Fildder的两张设置图片 电脑使用cmd-->    netstat     -an     -->查看配置情况,出现了我们配置的端口号,OK,配置成功。 好的Fildder配置完毕,重启一下。 然后下载一个wifi共享软件,随便设置一下 这个时候
关于手机http请求的问题
请问各位高手 手机的http请求中有没有附带一些相关机型的信息?
用JAVA从PC向手机发短信!该如何处理!
我现在负责开发一个OA系统,系统中有这样一个功能,就是通过PC向某个用户的手机发送短信,用户能收到短信!这样一个过程该怎么来实现,我想知道其中都需要做哪些事情!做好条理清晰些!rn谢谢!
Fidder 监控手机Http请求
1.Fiddler下载 2:Fiddler设置打开Fiddler, 点击Tools-&gt; Fiddler Options (配置完后记得要重启Fiddler)选中"HTTPS下的Decrpt HTTPS traffic"(Fiddler就可以截获HTTPS请求) 选中"Connections下的Allow remote computers to connect". (允许别的机器把HT...
Jmeter-录制手机的http请求
1、先启动Jmeter。然后在工作台添加http代理服务器 设置如下 2、设置IE的代理 端口设置与上一步一致即可。 3、手机wifi设置代理连接打PC 将手机与电脑连接同一网络(如 连接同一个wifi) 打开cmd,用ipconfig命令查看电脑内网ip 修改手机连接的wifi的代理 4、启动代理服务器并且在手机上进行操作 转载于:htt...
如何识别手机和pc
Navigator.userAgent 早些年,我们常用它来识别不同浏览器,但现在浏览器、设备发展迅猛,它识别也不准确。不过我们仍然可以使用识别手机和非手机浏览器 console.log( navigator.userAgent ); //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)...
Java中简单Http请求
1. 概述 在这篇快速教程中,我们将使用Java内置类HttpUrlConnection来实现一个Http请求。 2. HttpUrlConnection HttpUrlConnection类允许我们不用添加其他任何类库就能实现基本的Http请求。所有需要的类都包含在java.net包内。缺点是,相比于其他http类库,该方法有点笨重,而且也没有提供一些高级特性的API,比如添加请求头,添...
VS获取PC的MAC地址
软件绑定PC的MAC地址可以有效防止一部分破解行为。 DOS端查看MAC地址的命令:ipconfig/all 以太网网卡对应的MAC地址:48-0F-CF-62-47-54。 下面是VS开发环境获取PC的MAC地址的代码文件,GetMacAddress.cpp。 #include "winsock.h" #include "stdio.h" #include &lt;IPHlpApi...
相关热词 c#串口测试应用程序 c# 匹配 正则表达式 c#防止窗体重绘 c#读写txt文件 c#挖地雷源代码 c#弹框选项 c# 移除 队列 c# 密码写入配置文件 c# 获取可用内存大小 c# 嵌入excel编辑