第一种方法是利用第三方IP地理位置查询服务。这些服务通常提供API接口,开发者可以通过调用API来获取IP地址的地理位置信息。以下是一个示例代码,演示如何使用免费的IP地理位置查询服务 IP-API.com:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public class IPGeolocation {
public static void main(String[] args) {
String ipAddress = "8.8.8.8"; // 需要查询的IP地址
Map<String, String> geoInfo = getIPGeolocationInfo(ipAddress);
if (geoInfo != null) {
System.out.println("IP地址: " + ipAddress);
System.out.println("国家: " + geoInfo.get("country"));
System.out.println("城市: " + geoInfo.get("city"));
System.out.println("经度: " + geoInfo.get("lat"));
System.out.println("纬度: " + geoInfo.get("lon"));
System.out.println("ISP: " + geoInfo.get("isp"));
} else {
System.out.println("无法获取IP地址 " + ipAddress + " 的地理位置信息。");
}
}
private static Map<String, String> getIPGeolocationInfo(String ipAddress) {
try {
String apiUrl = "http://ip-api.com/json/" + ipAddress;
URL url = new URL(apiUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
Map<String, String> geoInfo = new HashMap<>();
String[] fields = response.toString().split(",");
for (String field : fields) {
if (field.contains(":")) {
String[] keyValue = field.split(":");
String key = keyValue[0].replaceAll("\"", "").trim();
String value = keyValue[1].replaceAll("\"", "").trim();
geoInfo.put(key, value);
}
}
return geoInfo;
} else {
System.out.println("HTTP请求失败,响应码: " + responseCode);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
第二种方法是利用Java内置的 InetAddress
类。该类提供获取IP地址相关信息的方法,包括主机名、IP地址、以及主机地理位置信息(国家、城市等)。以下是一个示例代码:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IPAddressInfo {
public static void main(String[] args) {
String hostName = "www.example.com";
try {
InetAddress inetAddress = InetAddress.getByName(hostName);
System.out.println("主机名: " + inetAddress.getHostName());
System.out.println("IP地址: " + inetAddress.getHostAddress());
System.out.println("主机地理位置:");
System.out.println(" 国家: " + inetAddress.getCountry());
System.out.println(" 城市: " + inetAddress.getCity());
System.out.println(" 州/省: " + inetAddress.getState());
System.out.println(" 邮编: " + inetAddress.getPostalCode());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
需要注意的是,使用 InetAddress
类获取地理位置信息的准确性可能受到各种因素的影响,如IP地址的类型(公网IP还是内网IP)、网络环境等。在某些情况下,可能无法准确获取地理位置信息。
在Java中,获取IP地址的地理位置信息可以采用以上两种方法。使用第三方IP地理位置查询服务可以获取更加详细的信息,但需要依赖外部服务,可能会受到一些限制,如请求频率、查询次数等。而使用Java内置的 InetAddress
类则更加简单,但可能无法获取完整的地理位置信息。开发者可以根据自己的需求,选择合适的方法来实现IP地址的地理位置查询。无论采用哪种方法,熟练掌握这些技术,都可以为开发工作带来便利。