获取客户机的ip和mac地址
只获取clientIP
1 package com.ppms.utils; 2 3 import javax.servlet.http.HttpServletRequest; 4 5 /** 6 * Created by liangyadong on 2018/9/6 0006. 7 */ 8 public class GetClientIPUtil { 9 10 public static String getIpAddr(HttpServletRequest request){ 11 String ip = request.getHeader("X-Forwarded-For"); 12 if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 13 ip = request.getHeader("Proxy-Client-IP"); 14 } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 15 ip = request.getHeader("WL-Proxy-Client-IP"); 16 } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 17 ip = request.getHeader("HTTP-CLIENT-IP"); 18 } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 19 ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 20 } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 21 ip = request.getRemoteAddr(); 22 } 23 return ip; 24 } 25 }
================================================我是分割线.==================================================
获取ip和mac地址:
jsp:
<%@ page import="com.ppms.utils.UdpGetClientMacAddr" %> <% String macAddress = ""; String sip = request.getHeader("x-forwarded-for"); if(sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) { sip = request.getHeader("Proxy-Client-IP"); } if(sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) { sip = request.getHeader("WL-Proxy-Client-IP"); } if(sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) { sip = request.getRemoteAddr(); } UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip); macAddress = umac.GetRemoteMacAddr(); %> <input id="mac" type="hidden" value="<%=macAddress%>">
java:
1 package com.ppms.utils; 2 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.LineNumberReader; 6 import java.net.DatagramPacket; 7 import java.net.DatagramSocket; 8 import java.net.InetAddress; 9 10 /** 11 * Created by liangyadong on 2018/8/6 0006. 12 */ 13 public class UdpGetClientMacAddr { 14 private String sRemoteAddr; 15 private int iRemotePort=137; 16 private byte[] buffer = new byte[1024]; 17 private DatagramSocket ds=null; 18 19 public UdpGetClientMacAddr(String strAddr) throws Exception{ 20 sRemoteAddr = strAddr; 21 ds = new DatagramSocket(); 22 } 23 24 protected final DatagramPacket send(final byte[] bytes) throws IOException { 25 DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName(sRemoteAddr),iRemotePort); 26 ds.send(dp); 27 return dp; 28 } 29 30 protected final DatagramPacket receive() throws Exception { 31 DatagramPacket dp = new DatagramPacket(buffer,buffer.length); 32 ds.receive(dp); 33 return dp; 34 } 35 // 询问包结构: 36 // Transaction ID 两字节(16位) 0x00 0x00 37 // Flags 两字节(16位) 0x00 0x10 38 // Questions 两字节(16位) 0x00 0x01 39 // AnswerRRs 两字节(16位) 0x00 0x00 40 // AuthorityRRs 两字节(16位) 0x00 0x00 41 // AdditionalRRs 两字节(16位) 0x00 0x00 42 // Name:array [1..34] 0x20 0x43 0x4B 0x41(30个) 0x00 ; 43 // Type:NBSTAT 两字节 0x00 0x21 44 // Class:INET 两字节(16位)0x00 0x01 45 protected byte[] GetQueryCmd() throws Exception { 46 byte[] t_ns = new byte[50]; 47 t_ns[0] = 0x00; 48 t_ns[1] = 0x00; 49 t_ns[2] = 0x00; 50 t_ns[3] = 0x10; 51 t_ns[4] = 0x00; 52 t_ns[5] = 0x01; 53 t_ns[6] = 0x00; 54 t_ns[7] = 0x00; 55 t_ns[8] = 0x00; 56 t_ns[9] = 0x00; 57 t_ns[10] = 0x00; 58 t_ns[11] = 0x00; 59 t_ns[12] = 0x20; 60 t_ns[13] = 0x43; 61 t_ns[14] = 0x4B; 62 63 for(int i = 15; i < 45; i++) 64 { 65 t_ns[i] = 0x41; 66 } 67 68 t_ns[45] = 0x00; 69 t_ns[46] = 0x00; 70 t_ns[47] = 0x21; 71 t_ns[48] = 0x00; 72 t_ns[49] = 0x01; 73 return t_ns; 74 } 75 // 表1 “UDP-NetBIOS-NS”应答包的结构及主要字段一览表 76 // 序号 字段名 长度 77 // 1 Transaction ID 两字节(16位) 78 // 2 Flags 两字节(16位) 79 // 3 Questions 两字节(16位) 80 // 4 AnswerRRs 两字节(16位) 81 // 5 AuthorityRRs 两字节(16位) 82 // 6 AdditionalRRs 两字节(16位) 83 // 7 Name<Workstation/Redirector> 34字节(272位) 84 // 8 Type:NBSTAT 两字节(16位) 85 // 9 Class:INET 两字节(16位) 86 // 10 Time To Live 四字节(32位) 87 // 11 Length 两字节(16位) 88 // 12 Number of name 一个字节(8位) 89 // NetBIOS Name Info 18×Number Of Name字节 90 // Unit ID 6字节(48位 91 protected final String GetMacAddr(byte[] brevdata) throws Exception { 92 // 获取计算机名 93 int i = brevdata[56] * 18 + 56; 94 String sAddr=""; 95 StringBuffer sb = new StringBuffer(17); 96 // 先从第56字节位置,读出Number Of Names(NetBIOS名字的个数,其中每个NetBIOS Names Info部分占18个字节) 97 // 然后可计算出“Unit ID”字段的位置=56+Number Of Names×18,最后从该位置起连续读取6个字节,就是目的主机的MAC地址。 98 for(int j = 1; j < 7;j++) 99 { 100 sAddr = Integer.toHexString(0xFF & brevdata[i+j]); 101 if(sAddr.length() < 2) 102 { 103 sb.append(0); 104 } 105 sb.append(sAddr.toUpperCase()); 106 // if(j < 6) sb.append(':');//用:分隔 107 if(j < 6) sb.append('-');//用-分隔 108 } 109 return sb.toString(); 110 } 111 112 public final void close() { 113 try 114 { 115 ds.close(); 116 } 117 catch (Exception ex){ 118 ex.printStackTrace(); 119 } 120 } 121 122 public final String GetRemoteMacAddr() throws Exception { 123 byte[] bqcmd = GetQueryCmd(); 124 send(bqcmd); 125 DatagramPacket dp = receive(); 126 String smac = GetMacAddr(dp.getData()); 127 close(); 128 129 return smac; 130 } 131 132 public String getMACAddress(String ip){ 133 String str = ""; 134 String macAddress = ""; 135 try { 136 Process p = Runtime.getRuntime().exec("nbtstat -A " + ip); 137 InputStreamReader ir = new InputStreamReader(p.getInputStream()); 138 LineNumberReader input = new LineNumberReader(ir); 139 for (int i = 1; i < 100; i++) { 140 str = input.readLine(); 141 if (str != null) { 142 if (str.indexOf("MAC Address") > 1) { 143 macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length()); 144 break; 145 } 146 } 147 } 148 } catch (IOException e) { 149 e.printStackTrace(System.out); 150 } 151 return macAddress; 152 } 153 154 }
注意106和107两行的注释.
作者:习惯沉淀
如果文中有误或对本文有不同的见解,欢迎在评论区留言。
如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!