避免使用InetAddress - 以网络字节顺序获取原始IP地址

时间:2010-05-02 10:29:37

标签: java google-app-engine inetaddress

我正在尝试在Google App Engine上使用MaxMind GeoLite国家/地区数据库。但是,我很难让Java API工作,因为它依赖于App引擎上无法使用的InetAddress类。

但是,我不确定是否有一个简单的解决方法,因为它似乎只使用InetAddress类来确定给定主机名的IP。就我而言,无论如何,主机名始终是IP。

我需要的是一种将表示为String的IP地址转换为网络字节顺序的字节数组(InetAddress类的addr.getAddress()方法提供的方法)。

这是当前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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

GeoIPCountryWhois数据库中的所有12000多个条目的格式为:

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

将你所拥有的虚线四边形地址分解为子串并按范围进行范围检查。