Nombre del equipo cliente en java

Quiero encontrar el nombre de la computadora del cliente en Java. Mi aplicación se ejecuta en la intranet. entonces estoy usando el siguiente código

   public String findClientComputerName(HttpServletRequest request) {
    String computerName = null;
    String remoteAddress = request.getRemoteAddr();
    System.out.println("remoteAddress: " + remoteAddress);
    try {
        InetAddress inetAddress = InetAddress.getByName(remoteAddress);
        System.out.println("inetAddress: " + inetAddress);
        computerName = inetAddress.getHostName();
        System.out.println("computerName: " + computerName);
        if (computerName.equalsIgnoreCase("localhost")) {
            computerName = java.net.InetAddress.getLocalHost().getCanonicalHostName();
        } 
    } catch (UnknownHostException e) {
        log.error("UnknownHostException detected in StartAction. ", e);
    }
    if(StringUtils.trim(computerName).length()>0) computerName = computerName.toUpperCase();
    System.out.println("computerName: " + computerName);
    return computerName;
}

pero a veces obtengo el nombre de host correctamente pero a veces no. Estoy obteniendo IP correcta. ¿Cuál puede ser la razón de esto? ¿Por qué inetAddress.getHostName();no se puede dar el nombre de host en algún momento? Su ayuda es muy apreciada.

Respuesta 1
   private String getHostName (InetAddress inaHost) throws UnknownHostException
    {
       try
       {
           Class clazz = Class.forName("java.net.InetAddress");
           Constructor[] constructors = clazz.getDeclaredConstructors();
           constructors[0].setAccessible(true);
           InetAddress ina = (InetAddress) constructors[0].newInstance();

           Field[] fields = ina.getClass().getDeclaredFields();
           for (Field field: fields)
           {
               if (field.getName().equals("nameService"))
               {
                   field.setAccessible(true);
                   Method[] methods = field.get(null).getClass().getDeclaredMethods();
                   for (Method method: methods)
                   {
                        if (method.getName().equals("getHostByAddr"))
                        {
                            method.setAccessible(true);
                            return (String) method.invoke(field.get (null), inaHost.getAddress());
                        }
                   }
               }
           }
       } catch (ClassNotFoundException cnfe) {
       } catch (IllegalAccessException iae) {
       } catch (InstantiationException ie) {
       } catch (InvocationTargetException ite) {
           throw (UnknownHostException) ite.getCause();
       }
       return null;
    }

la función anterior devuelve el nombre de host correctamente en la Intranet. para local devolverá localhost. Para obtener el nombre del host local usamoscomputerName = java.net.InetAddress.getLocalHost().getCanonicalHostName();

Respuesta: 2

HttpServletRequest le devolverá la dirección IP (ya sea v4 o v6) de quien esté presionando su servlet. Esa dirección puede o no resolverse a un nombre de host válido. InetAddress.getHostName () realiza una resolución DNS inversa de la dirección IP. No es necesario que cada dirección IP asignada asigne de nuevo a una entrada DNS válida. De hecho, hay un gran porcentaje de direcciones IP en el mundo que no se resolverán en un nombre de host.

Puede ver lo mismo usando el comando 'host' en un cuadro de Linux para buscar la entrada inversa de DNS (si la hay) para una dirección IP dada.

Respuesta: 3

La función InetAddress.getHostName () devolverá el nombre de host si el objeto InetAddress se inicializó con un nombre de host. De lo contrario, realizará una búsqueda inversa de DNS para obtener el nombre de host.

Para que esta búsqueda inversa de DNS funcione, deberá asegurarse de que todos los clientes de su intranet estén configurados con nombres de host y que su proveedor de DNS (por ejemplo, su enrutador) coincida correctamente con los nombres de host con sus registros. (Algunos enrutadores pueden hacer esto automáticamente).

Respuesta: 4

Mi aplicación de Android necesita recuperar información sobre un contacto (es decir, número de teléfono y nombre). Escribí un código usando getContentResolver (). Query () En los resultados, veo que el nombre se está ...

Estoy buscando escribir un pequeño juego de texto basado en cliente-servidor que maneje múltiples conexiones de cliente y afecte de manera persistente el estado del juego. Me pregunto cuál sería la mejor manera de manejar múltiples ...

¿Cuál es la diferencia entre pasar en parámetro genérico alguna clase genérica con y sin su parámetro genérico? Ejemplo: clase genérica simple: clase pública Foo <T> {/*...*/} simple ...

Digamos que definí el siguiente servicio de servicio Thrift FileResource {binary get_file (1: string file_name)} Aquí está la implementación generada que no puedo entender pública ByteBuffer ...