Избегайте использования InetAddress - получение необработанного IP-адреса в сетевом порядке байтов - PullRequest
1 голос
/ 02 мая 2010

Я пытаюсь использовать базу данных MaxMind GeoLite Country в Google App Engine. Однако у меня возникают трудности с работой API Java, поскольку он опирается на класс InetAddress, который недоступен для использования в App Engine.

Однако я не уверен, что существует простой обходной путь, так как кажется, что он использует только класс InetAddress для определения IP-адреса данного имени хоста. В моем случае имя хоста всегда равно IP.

Мне нужен способ преобразования IP-адреса, представленного в виде String, в байтовый массив сетевого порядка байтов (который обеспечивает метод addr.getAddress () класса InetAddress).

Это код, который используется текущим API, мне нужно найти способ удалить все ссылки на InetAddress, хотя он по-прежнему работает!

Спасибо за ваше время.

/**
 * Returns the country the IP address is in.
 *
 * @param ipAddress String version of an IP address, i.e. "127.0.0.1"
 * @return the country the IP address is from.
 */
public Country getCountry(String ipAddress) {
    InetAddress addr;
    try {
        addr = InetAddress.getByName(ipAddress);
    } catch (UnknownHostException e) {
        return UNKNOWN_COUNTRY;
    }
    return getCountry(bytesToLong(addr.getAddress()));
}

Ответы [ 2 ]

1 голос
/ 02 мая 2010

Все 12000+ записей в базе данных GeoIPCountryWhois имеют вид:

"4.17.135.32","4.17.135.63","68257568","68257599","CA","Canada"

разбейте имеющийся у вас точечный четырехугольный адрес на подстроки и проверьте диапазон таким образом.

1 голос
/ 02 мая 2010
// note: this is ipv4 specific, and i haven't tried to compile it.
long ipAsLong = 0;
for (String byteString : ipAddress.split("\\."))
{
    ipAsLong = (ipAsLong << 8) | Integer.parseInt(byteString);
}
...