Получить Unix хостид в Java - PullRequest
5 голосов
/ 24 июня 2011

Как я могу получить Unix-хостинг в Java с помощью какого-то вызова?

http://linux.about.com/library/cmd/blcmdl1_hostid.htm

Ответы [ 5 ]

2 голосов
/ 25 июня 2011

Если для предыдущего вызова было установлено значение sethostid(long int id), оно будет находиться в HOSTIDFILE, обычно /etc/hostid.

Если его там нет, вы выбираете имя хоста машины. Вы извлекаете адрес для имени хоста, и если это IPv4, это адрес IPv4, отформатированный от десятичного числа до двоичного числа с заменой старших 16 битов и младших 16 битов.

InetAddress addr = InetAddress.getLocalHost();
byte[] ipaddr = addr.getAddress();
if (ipaddr.length == 4) {
  int hostid = 0 | ipaddr[1] << 24 | ipaddr[0] << 16 | ipaddr[3] << 8 | ipaddr[2];
  StringBuilder sb = new StringBuilder();
  Formatter formatter = new Formatter(sb, Locale.US);
  formatter.format("%08x", hostid);
  System.out.println(sb.toString());
} else {
  throw new Exception("hostid for IPv6 addresses not implemented yet");
}
1 голос
/ 24 июня 2011

Возможно, следующая статья поможет.

http://www.devdaily.com/java/java-exec-processbuilder-process-1

1 голос
/ 24 июня 2011

Вызов Runtime.exec(String), где аргумент - это путь к исполняемому файлу "hostid", затем слить оба потока результирующего Process объекта и взять содержимое стандартавыходной поток как строковое значение.

Этот простой класс демонстрирует, как вы могли бы реализовать эту стратегию (но нуждается в улучшении для обработки ошибок [например, stderr, исключения] и рекомендаций OOP [например, возвращая объект со свойствами bean,и т. д.]):

public class RunCommand {
  public static String exec(String command) throws Exception {
    Process p = Runtime.getRuntime().exec(command);
    String stdout = drain(p.getInputStream());
    String stderr = drain(p.getErrorStream());
    return stdout; // TODO: return stderr also...
  }
  private static String drain(InputStream in) throws IOException {
    int b = -1;
    StringBuilder buf = new StringBuilder();
    while ((b=in.read()) != -1) buf.append((char) b);
    return buf.toString();
  }
}

Ваша программа может использовать его следующим образом:

String myHostId = RunCommand.exec("/usr/bin/hostid").trim();

Обратите внимание, что для создания Process используется ProcessBuilder.может быть более подходящим, чем Runtime.exec(), если вашей команде нужны аргументы или окружение и т. д.

1 голос
/ 24 июня 2011

Тебе придется написать JNI (или JNA ), боюсь.

0 голосов
/ 24 июня 2011

Попробуйте это (конечно, в каком-то классе):

import java.net.InetAddress;
import java.net.UnknownHostException;

public static String getLocalHostIP()
    throws UnknownHostException
{
    InetAddress  ip;

    ip = InetAddress.getLocalHost();
    return ip.getHostAddress();
}

Метод возвращает строку вида "xxx.xxx.xxx.xxx".

ОБНОВЛЕНИЕ

Улучшен метод:

// Determine the IP address of the local host
public static String getLocalHostIP()
{
    try
    {
        return InetAddress.getLocalHost().getHostAddress();
    }
    catch (UnknownHostException ex)
    {
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...