Получить имя компьютера как имя хоста на сервере с помощью Java [duplicate]

Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте IEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double. Суть проблемы состоит в том, что числа представлены в этом формате как целое число раз в два раза; рациональные числа (такие как 0.1, который является 1/10), знаменатель которого не является степенью двух, не могут быть точно представлены.

Для 0.1 в стандартном формате binary64 представление может записывается в точности как

  • 0.1000000000000000055511151231257827021181583404541015625 в десятичной форме или
  • 0x1.999999999999ap-4 в нотации C99 hexfloat .

Напротив, рациональное число 0.1, которое является 1/10, может быть записано точно как

  • 0.1 в десятичной форме или
  • 0x1.99999999999999...p-4 в аналоге обозначения гексафлоата C99, где ... представляет собой бесконечную последовательность 9.

Константы 0.2 и 0.3 в вашей программе также будут приближенными к их истинные ценности. Бывает, что ближайший double до 0.2 больше, чем рациональное число 0.2, но ближайший double до 0.3 меньше, чем рациональное число 0.3. Сумма 0.1 и 0.2 заканчивается выше, чем рациональное число 0.3 и, следовательно, не согласуется с константой в вашем коде.

Достаточно полное рассмотрение арифметических вопросов с плавающей запятой Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой . Для более простого объяснения см. floating-point-gui.de .

1
задан BalusC 17 March 2016 в 11:09
поделиться

2 ответа

Я нашел способ получить имя клиентской машины.

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    Logger.getLogger(this.getClass()).warning("Inside Confirm Servlet");  
    response.setContentType("text/html");

    String hostname = request.getRemoteHost(); // hostname
    System.out.println("hostname"+hostname);

    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) {

        }

    System.out.println("computerName: " + computerName);
}    
1
ответ дан Neha 24 August 2018 в 05:50
поделиться

Возможно ли получить имя клиентской машины?

Возможно, вы, вероятно, ссылаетесь на имя NetBIOS. Если это так, вы должны использовать некоторую библиотеку, которая реализует NetBIOS / SMB / CIFS в java для этого.

, если возможно, как

Посмотрите на JCIFS . Я не дам вам точный фрагмент кода, но это направление, в котором вы должны двигаться, чтобы решить эту проблему.

Или есть ли другой способ получить данные этого пользователя

Насколько я понимаю вашу проблему, вам нужен способ определить хост, и вы не можете полагаться на IP-адрес для этого.

Если это так, то один из других вариантов будет использовать MAC-адрес, но вы, вероятно, не сможете это сделать с чистой java, поскольку это более низкоуровневый протокол, с которым обычно работает Java, поэтому он, вероятно, будет менее переносимым. Этот учебник может помочь.

UPDATE

Я сталкиваюсь с стеком NetBIOS / SMB / CIFS, но я не работал с ним в Java и JCIFS . Вот почему я не буду давать вам конкретную часть кода, которая решит вашу проблему, а скорее направление, в котором вы должны смотреть.

Отметьте NbtAddress класс docs. Кажется, это то, что вы ищете. Также ознакомьтесь с примерами , чтобы получить представление о том, как его можно использовать.

0
ответ дан Eugene Loy 24 August 2018 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: