Recientemente, una determinada función del proyecto debe obtener una ubicación geográfica detallada de una interfaz de terceros basada en la dirección IP. He encontrado muchos ejemplos de Internet, incluidos Sina, Taobao y Tencent. Probé Taobao. Si es un pequeño orden de magnitud, está bien. Si alcanza un nivel de 100,000, la velocidad será lenta, lo que hará que el sistema se bloquee. El siguiente ejemplo es de Sina. El ejemplo no es adecuado para cada proyecto y debe modificarse.
/** ipsearchurl = http: //int.dpool.sina.com.cn/iplookup/iplookup.php? format = js & ip = (Esta es la dirección de interfaz de Sina) en el proyecto, la dirección de interfaz de Sina no está escrita directamente, pero el archivo de atributo se lee. */ public static String getIPInfobysina (String IP) {// lee el archivo de atributo (archivo de archivo de propiedad-valor y formato final) string final prop_ipsearchurl = "ipsearchurl"; Cadena final ret_success = "1"; cadena final ret = "ret"; Final String Province = "Province"; Final String City = "City"; Final String District = "Distrito"; String final isp = "isp"; Cadena ipaddress = ""; if (stringUtils.isblank (ip)) {return null; } String url = systemParAMPropertyUtil.getSystemParamKeyValue (prop_ipsearchurl); // Esto es para obtener la URL del archivo de propiedades, es decir, la dirección de la interfaz de Sina if (stringUtils.isnotblank (url)) {cadena ruta = url+ip; // "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip="+ip; HttpClient httpClient = new httpClient (); Map <string, string> parammap = new Hashmap <String, String> (); String RemoteIPInfo = ""; Pruebe {remotaIPInfo = httpClientUtil.Request (httpclient, ruta, parammap, "sina"); } catch (Exception e) {E.PrintStackTrace (); } if (stringUtils.isNotBlank (remotionIPInfo)) {string _ret = searchValue (remotSipInfo, ret); if (ret_success.equals (_ret)) {string provinceName = SearchValue (remotos de control, provincia); String CityName = SearchValue (RemoteIPInfo, City); String District = SearchValue (RemoteIPInfo, District); Cadena isp = SearchValue (RemoteIPInfo, ISP); ipaddress = Provincename+CityName+District+ISP; }}} return ipaddress; } string static static private SearchValue (String RemoteIPInfo, Key String) {String _value = ""; if (stringUtils.isNotBlank (remotoIPInfo)) {_value = stringUtils.substringbetween (remotSipInfo, "/" "+key+"/":", ","); if (stringUtils.isNotBlank (_Value)) {_value = uniCodeUtils.decodeUnicode (_value); }} return _Value; } Leí la dirección de la interfaz SINA muy rápidamente. Lo probé durante unos 90,000, diez minutos. Para Taobao, más de una hora, más de 50,000 piezas. Hay otro truco, que es guardar la IP de lectura en el mapa, y luego sacarlo directamente del mapa si lo lee la próxima vez, que es mucho más rápido. Esto conducirá a muchos problemas. Cuando los archivos de registro llegan a los millones o decenas de millones, ¿cómo resolverlos? Para ejemplos como Taobao, cada pedido es diferente en número de pedidos en un segundo. No sé cómo resolverlo. Un gran Dios sabe responderme.
Lo siguiente es Taobao.
import java.io.bufferedReader; import java.io.dataOutputStream; import java.io.ioException; import java.io.inputStreamReader; import java.io.unsupportedenCodingException; import java.net.httpurlconnection; import java.net.url;/*** GEACTURA DEL DIUSTEDIO IPURA IPURA IPLI @author lwl * @datejan 26, 2016 * /public class DirectionUtils { /** * @param Content * El formato de parámetro solicitado es: name = xxx & pwd = xxx * @param codificación * Encodificación de solicitud del lado del servidor. Por ejemplo, GBK, UTF-8, etc. * @return * @throws UnsupportedEnCodingException */public String getAddresses (String Content, String CodingString) lanza UnsupportedEnCodingException {// Llame a la interfaz de interfaz URLSTR = "Http:/P.TaOBAO.com/service/getipinfo.php.php" // Obtenga la información de la provincia, la ciudad y el distrito donde la IP se encuentra desde http://whois.pconline.com.cn string returnstr = this.getResult (urlstr, content, codingstring); if (returnStr! = null) {// procesar el sistema de información provincial y municipal devuelto.out.println (returnstr); String [] temp = returnstr.split (","); if (temp.length <3) {return "0"; // inválido ip, test} string región = (temp [5] .split (":") [1] .replaceall ("/", "," "); región = decodeunicode (región); // province país =" ";"; // string región = ""; string city = ";"; ";" String city = ";" String city = ";" String iSp. = ""; país = decodeunicode (país); // ruptura de país; Caso 3: área = (temp [i] .split (":")) [1] .replaceAll ("/" "," "); área = decodeunicode (área); // ruptura de región; caso 5: región = (temp [i] .split (": ") [1] .replaceall ("/"", "); región = decodeunicode (región); // break de provincia; Caso 7: City = (temp [i] .split (":")) [1] .replaceAll ("/" "," "); ciudad = decodeunicode (ciudad); // break de ciudad; caso 9: condado = (temp [i] .split (": ") [1] .replaceall ("/"", "); condado = decodeunicode (condado); // ruptura de la región; Caso 11: isp = (temp [i] .split (":")) [1] .replaceAll ("/" ","); isp = decodeunicode (isp); // break de la empresa isp;}} system.out.println (país+área+región+ciudad+condado+isp); return new New StringBuffer (país) .Append (área) .Append (región) .Append (ciudad) .Append (condado) .Append (ISP) .ToString (); GBK, UTF-8, etc. * @return */ private String getResult (string urlstr, contenido de cadena, codificación de cadena) {url url = null; Connect.SetConnectTimeOut (2000); // Establezca el tiempo de tiempo de espera de conexión en MilliseConds Connection.SetReadTimeOut (33000); /// Establezca el tiempo de espera para leer datos, en MilliseConds Connection.setDoOutput (true); // si abrir la transmisión de salida verdadera | False Connection.SetDoInput (verdadero); // si abrir la entrada de la entrada verdadera verdadera CONNECTIÓN. Enviar método POST | Get Connection.SetUsecaches (false); // si a la caché true | false conexión.connect (); // Abrir el puerto de conexión dataOutputStream out = new DataOutputStream (Connection.getOutputStream ()); // Abrir el flujo de salida y escribir datos a la fuente de pares.WriteBytes (contenido); // Data de escritura, es decir, Subs su nombre = xxxxx. out.flush (); // refresh out.close (); // cerrar el flujo de salida BufferedReader lector = new BufferedReader (new InputStreamReader (Connection.getInputStream (), codificación)); // Después de escribir datos en el servidor de pares, return Data //, use la transmisión de Buffereder StriveR para leer StringBuffer Buffer = new StringBuffer ();); Línea de cadena = ""; while ((línea = lector.readline ())! = null) {buffer.append (línea); } lector.close (); return buffer.ToString (); } catch (ioException e) {E.PrintStackTrace (); } Finalmente {if (conexión! = NULL) {Connection.Disconnect (); // Cerrar la conexión}} return null; } / ** * Unicode se convierte a chino * * @author fanhui 2007-3-15 * @param thestring * @return * / public static string decodeunicode (string thestring) {char achar; int len = thestring.length (); StringBuffer outbuffer = new StringBuffer (Len); para (int x = 0; x <len;) {achar = thestring.charat (x ++); if (achar == '//') {achar = thestring.charat (x ++); if (achar == 'u') {int value = 0; para (int i = 0; i <4; i ++) {achar = thestring.charat (x ++); switch (achar) {case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': valor = (valor << 4) + achar - '0'; romper; caso 'a': caso 'b': caso 'c': caso 'd': case 'e': case 'f': valor = (valor << 4) + 10 + achar - 'a'; romper; caso 'a': caso 'b': caso 'c': caso 'd': case 'e': case 'f': valor = (valor << 4) + 10 + achar - 'a'; romper; caso 'a': caso 'b': caso 'c': caso 'd': case 'e': case 'f': valor = (valor << 4) + 10 + achar - 'a'; romper; predeterminado: arroje nuevo IllegalArgumentException ("codificación malformada"); }} outbuffer.append ((char) valor); } else {if (achar == 't') {achar = '/t'; } else if (achar == 'r') {achar = '/r'; } else if (achar == 'n') {achar = '/n'; } else if (achar == 'f') {achar = '/f'; } outbuffer.append (achar); }} else {outbuffer.append (achar); }} return outBuffer.ToString (); } // prueba public static void main (string [] args) {DirectionUtils DirectionUtils = new DirectionUtils (); // prueba IP 219.136.134.157 China = South China = Provincia de Guangdong = Guangzhou City = Yuexiu District = Telecom String IP = "125.70.11.136"; Dirección de cadena = ""; Pruebe {dirección = direccionalUtils.getAddresses ("ip ="+ip, "utf-8"); } Catch (UnsupportedEnCodingException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } System.out.println (dirección); // El resultado de la salida es: Provincia de Guangdong, ciudad de Guangzhou, distrito de Yuexiu}}