2

我正在尝试读取子网内客户端的 Mac 地址(但不在运行我的 testServer 应用程序的同一台机器上)

@ManagedBean
public class ManagedBeanController implements Serializable {

private static final long serialVersionUID = -3244711761400747261L;

private String hostMac;
private InetAddress hostIp;
private String tmpIp;

// snippet taken from a BalusC post , works great. just pointing out that 
// in case of a request from a client running on the same machine of the server, 
// it return 127.0.0.1 (lookpback) instead of the actual localhost IP
public ManagedBeanController() {    
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    tmpIp = request.getRemoteAddr();                            
}

public void ReadHostMac() 
{
    try {

        // InetAddress address = InetAddress.getLocalHost(); **COMMENTED**
        InetAddress address = InetAddress.getByName(tmpIp); 
        System.out.println("Current IP address : " + address.getHostAddress() );
        System.out.println("Host NAME : " + address.getHostName() );

        NetworkInterface network = NetworkInterface.getByInetAddress(address);

        if ( network!=null ) 
        {
            byte[] mac = network.getHardwareAddress();

            if ( mac != null ) 
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < mac.length; i++) {
                    sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
                }

                System.out.println("Current MAC address : " + sb.toString());
                setHostMac(sb.toString());

            } 
            else
            {               
                System.out.println("MAC address NULL");
                setHostMac("MAC address NULL");
            }

        }

    } catch (UnknownHostException e) {

        e.printStackTrace();

    } catch (SocketException e){

        e.printStackTrace();

    }
}

// getters and setters

}

这个 Bean 返回的是什么:
如果在代码中使用 address = InetAddress.getLocalHost();
它只返回 localhost Mac 地址,无论哪个客户端正在连接。
InetAddress 地址 = InetAddress.getByName(tmpIp);
在这种情况下,网络属性在本地调用的情况下正确返回,但不是 MAC 属性,更糟糕的是“远程”(仍然在子网内)调用,在这种情况下,即使 NETWORK 属性也返回为 NULL。
任何提示表示赞赏,谢谢

4

0 回答 0