Имя клиентского компьютера в Java - PullRequest
2 голосов
/ 22 октября 2010

Я хочу найти имя клиентского компьютера в Java.Мое приложение работает в интранете.поэтому я использую код ниже

   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;
}

, но иногда я получаю имя хоста правильно, но иногда нетЯ получаю правильный IP.В чем может быть причина этого?Почему inetAddress.getHostName(); не может дать имя хосту некоторое время?Ваша помощь очень ценится.

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010
   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;
    }

выше функции, возвращающей имя хоста правильно в интрасети.для локальных он вернет localhost.Чтобы получить имя для локального хоста, мы используем computerName = java.net.InetAddress.getLocalHost().getCanonicalHostName();

1 голос
/ 22 октября 2010

Функция InetAddress.getHostName () возвращает имя хоста, если объект InetAddress был инициализирован с именем хоста.В противном случае будет выполнен обратный поиск DNS для получения имени хоста.

Чтобы этот обратный поиск DNS работал, вам необходимо убедиться, что все клиенты в вашей интрасети настроены с именами хостов.и что ваш DNS-провайдер (например, ваш маршрутизатор) правильно сопоставляет имена хостов с их записями.(Некоторые маршрутизаторы могут делать это автоматически.)

1 голос
/ 22 октября 2010

HttpServletRequest вернет IP-адрес (v4 или v6) того, кто поражает ваш сервлет. Этот адрес может или не может разрешить к действительному имени хоста. InetAddress.getHostName () выполняет обратное DNS-разрешение IP-адреса. Не требуется, чтобы каждый выделенный IP-адрес отображался обратно на действительную запись DNS. На самом деле в мире существует большой процент IP-адресов, которые не разрешаются на имя хоста.

Вы можете увидеть то же самое, используя команду 'host' в окне linux, чтобы найти обратную запись DNS (если есть) для данного IP-адреса.

0 голосов
/ 22 октября 2010

Чтобы получить имя хоста машин Windows, вам необходимо выполнить обратный поиск NetBIOS по IP-адресу.Windows использует систему под названием WINS для предоставления имен хостов своим компьютерам.Эта система основана на NetBIOS.

Если вы не хотите пытаться найти спецификацию протокола и реализовать ее самостоятельно, тогда вы захотите выполнить команду nbtstat -A [ip address], если вы в Windows,или nmblookup -A [ip address], если вы используете Linux.Если вы работаете на компьютере с Linux, пакет Samba должен быть установлен, поскольку исполняемый файл nmblookup установлен на всех компьютерах с Linux.Затем вам придется проанализировать выходные данные этой команды, чтобы получить имя хоста.

Альтернатива, как указано выше, состоит в том, чтобы попытаться найти спецификацию протокола и реализовать ту часть, которую вам нужно реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...