Java代码如何获取客户端的MAC地址

作者&投稿:荣志 (若有异议请与网页底部的电邮联系)
求获取客户端mac地址java代码,急需急需,麻烦了~

通过ip获取指定ip地址的mac地址,ip可以通过请求request获取,
request.getRemoteAddr();
(当然获取ip也不是在任何情况下都有效的)
通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址。
您也许需要通过其他的方式获取,(见附)
//获取mac如下 (nbtstat -A IPAddress是对给定的IP地址解析其主机名。如果不能正常解析它的主机
//名的话,有可能是防火墙屏蔽了。也可能是在DNS中将NetBios 解析选项屏蔽了。)
public String getMACAddress(String ip){
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++) {
str = input.readLine();
if (str != null) {
if (str.indexOf("MAC Address") > 1) {
macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());
break;
}
if (str.indexOf("MAC Address") > 1) {
macAddress = str.substring(str.indexOf("MAC 地址") + 14, str.length());
break;
}
//以上有个判断,不同系统cmd命令执行的返回结果展示方式不一样,我测试的win7是MAC 地址
//所以又第二个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");
}

获得客户端真实IP地址的方法二:
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

  可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?

  答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:
X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实IP为: 192.168.1.110

import java.net.InetAddress;

import java.net.NetworkInterface;

import java.net.SocketException;

import java.net.UnknownHostException;


/*

* 物理地址是48位,别和ipv6搞错了

*/

public class LOCALMAC {


/**

* @param args

* @throws UnknownHostException

* @throws SocketException

*/

public static void main(String[] args) throws UnknownHostException, SocketException {

// TODO Auto-generated method stub



//得到IP,输出PC-201309011313/122.206.73.83

InetAddress ia = InetAddress.getLocalHost();

System.out.println(ia);

getLocalMac(ia);

}


private static void getLocalMac(InetAddress ia) throws SocketException {

// TODO Auto-generated method stub

//获取网卡,获取地址

byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();

System.out.println("mac数组长度:"+mac.length);

StringBuffer sb = new StringBuffer("");

for(int i=0; i<mac.length; i++) {

if(i!=0) {

sb.append("-");

}

//字节转换为整数

int temp = mac[i]&0xff;

String str = Integer.toHexString(temp);

System.out.println("每8位:"+str);

if(str.length()==1) {

sb.append("0"+str);

}else {

sb.append(str);

}

}

System.out.println("本机MAC地址:"+sb.toString().toUpperCase());

}

}

public String getMAC() { 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) { if ((index = message.indexOf("Physical Address")) > 0) { mac = message.substring(index + 36).trim(); break; } message = br.readLine(); } System.out.println(mac); br.close(); pro.destroy(); } catch (IOException e) { System.out.println("Can't get mac address!"); return null; } return mac; }

java如何获取客户端打印机 求教
答:Server端后台代码实现的打印,当然只能查找server所在的网络打印机咯。Server端最多知道client端IP相关的信息,要操作client端的事情,只能以此为延伸想办法吧。

如何使用java代码获取文件的svn版本号?
答:Eclipse(SUBclipse)有两种方式可以操作SVN,一种纯Java的方案SVNKIT,另外一种就是JNI对系统SVN客户端的封装。这也是 Java 操作 SVN 的方案。

java怎么获取系统用户名密码
答:当你使用用户名跟密码登录成功的时候,把用户名跟密码放在范围内.可以是request.setAttribute("username",username);也可以是session.setAttribute("username",username);然后在jsp页面可以用EL表达式拿也可以直接用java代码拿.${sessionScope.username},<%=session.getAttribute("username")%> ...

WEBSERVICES服务端怎么获取到客户端的请求URL
答:1.先搭建一个WebService接口.接口类:Java代码 package hello;public interface IHello { public String hello(String str,String str2) ;} 实现类:Java代码 package hello;public class Hello implements IHello{ public String hello(String str,String str2) { return "Hello world ,i'am "+str+...

java中如何获取到本机的外网ip地址?
答:java获取本机的外网ip示例:import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.regex.Matcher;import java.util.regex.Pattern;/ 获取本机外网IP地址 思想是访问网站http://checkip....

java 聊天室 源代码
答:【ClientSocketDemo.java 客户端Java源代码】import java.net.*;import java.io.*;public class ClientSocketDemo { //声明客户端Socket对象socket Socket socket = null;//声明客户器端数据输入输出流 DataInputStream in;DataOutputStream out;//声明字符串数组对象response,用于存储从服务器接收到的...

linux下wsdl2java获取源码命令
答:运行命令WSDL2Java。生成服务端代码命令是WSDL2Javauriwsdl文件全路径p包名dxmlbeanss,sssdssio生成的java代码存放路径。生成客户端包代码命令是WSDL2Java至uriwsdl文件全路径p包名dxmlbeansso生成的java代码存放路径。源码就是指编写的最原始程序的代码。运行的软件是要经过编写的,程序员编写程序的过程中...

java 中的socket 是不是从哪个端口发出客户端请求就从这个端口接收数据...
答:二、建立客户端代码 相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用"建立服务器"部分介绍的方法实现数据的输入和输出。Socket socket = new Socket("168.160.12.42",9998);或:Socket socket = new Socket(...

用java怎么开发聊天软件?
答:选择开发工具和框架:Java有很多优秀的开发工具和框架可供选择,例如Eclipse、IntelliJ IDEA、NetBeans等。同时,也有许多开源的框架可供选择,例如Spring、Spring Boot、Netty等。您可以根据自己的需求和喜好选择合适的工具和框架。设计系统架构:聊天软件需要考虑如何处理客户端和服务端之间的数据传输和交互。

java中如何获取cookie
答:getName()+"--->"+c.getValue()); } 控制台输出结果如下:username--->hzhpassword--->123JSESSIONID--->33BEAF95C526E0DDCF6A64990E533845注意: 1.服务器可以向客户端写内容, 只能是文本内容 2.客户端可以阻止服务器写入,禁用cookies 3.只能读取自己webapp写入的东西 ...