Récemment, une certaine fonction du projet doit obtenir une emplacement géographique détaillé à partir d'une interface tierce basée sur l'adresse IP. J'ai trouvé de nombreux exemples d'Internet, notamment Sina, Taobao et Tencent. J'ai essayé Taobao. S'il s'agit d'un petit ordre de grandeur, c'est OK. S'il atteint un niveau de 100 000, la vitesse sera lente, ce qui entraînera une écrasement du système. L'exemple suivant est de Sina. L'exemple ne convient pas à chaque projet et doit être modifié.
/ ** iPSearchurl = http: //int.dpool.sina.com.cn/iplookup/iplookup.php? format = js & ip = (il s'agit de l'adresse d'interface de Sina) Dans le projet, l'adresse d'interface de SINA n'est pas écrite directement, mais le fichier d'attribut est lu. * / public static String getipinfoBySina (String ip) {// Lire le fichier d'attribut (File de propriété Key-Value and Format) Final String prop_ipsearchurl = "iPSearchurl"; chaîne finale ret_success = "1"; chaîne finale ret = "ret"; province de chaîne finale = "Province"; String City final = "ville"; District final de cordes = "District"; chaîne finale ISP = "ISP"; String iPaddress = ""; if (stringUtils.isblank (ip)) {return null; } String url = systemParampRopertyUtils.getSystemParamKeyValue (prop_ipsearchurl); // c'est pour obtenir l'URL du fichier Propriétés, c'est-à-dire l'adresse d'interface SINA if (stringUtils.isnotblank (url)) {String path = 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 = ""; essayez {RemoteIpinfo = httpClientUtil.Request (httpclient, path, parammap, "sina"); } catch (exception e) {e.printStackTrace (); } if (stringUtils.isnotblank (RemoteIPinfo)) {String _ret = searchValue (RemoteIPinfo, ret); if (ret_success.equals (_ret)) {String provinceName = searchValue (RemoteIPinfo, province); String CityName = SearchValue (RemoteIpinfo, City); String District = SearchValue (RemoteIpinfo, District); String isp = searchValue (RemoteIPinfo, ISP); iPaddress = provinceName + CityName + District + ISP; }}} return iPaddress; } private static string searchValue (String RemoteIpinfo, String key) {String _Value = ""; if (stringUtils.isnotblank (RemoteIpinfo)) {_value = stringUtils.substringBetween (RemoteIpinfo, "/" "+ key +" / ":", ","); if (stringUtils.isnotblank (_value)) {_value = unicodeutils.decodeunicode (_value); }} return _value; } J'ai lu très rapidement l'adresse de l'interface SINA. Je l'ai testé pendant environ 90 000, dix minutes. Pour Taobao, plus d'une heure, plus de 50 000 pièces. Il y a une autre astuce, qui est de sauver l'IP de lecture dans la carte, puis de le retirer directement de la carte si vous le lisez la prochaine fois, ce qui est beaucoup plus rapide. Cela entraînera de nombreux problèmes. Lorsque les fichiers journaux atteignent les millions ou les dizaines de millions, comment les résoudre? Pour des exemples comme Taobao, chaque ordre est différent dans le nombre de commandes en une seconde. Je ne sais pas comment le résoudre. Un grand Dieu sait me répondre.
Ce qui suit est Taobao.
Importer java.io.bufferedReader; import java.io.dataoutputStream; import java.io.ioexception; import java.io.inputstreamreader; import java.io.unsupportedencodingException; @author lwl * @datejan 26, 2016 * / classe publique AddressUtils {/ ** * @param Contenu * Le format de paramètre demandé est: name = xxx & pwd = xxx * @param Encoding * de la demande du serveur Encoding. Par exemple, GBK, UTF-8, etc. * @Return * @Throws UnsupporTeDenCoDingException * / public String getAddress (String Content, String EncodingString) lance unpardedencodingException {// Appelez l'interface PConline String URLSTR = "htttp://ip.taobao.com/servce/getIpinfo.php"; // obtient les informations de la province, de la ville et du district où la propriété intellectuelle est située à partir de http://whois.pconline.com.cn String returnstr = this.getResult (urlstr, contenu, encodingstring); if (returnstr! = null) {// traite le système d'information provincial et municipal renvoyé.out.println (returnstr); String [] temp = returnstr.split (","); if (temp.Length <3) {return "0"; // non valide ip, test lan} string région = (temp [5] .split (":")) [1] .replaceAll ("/" ","); région = décodeunicode (région); // String province = "; String Area ="; ""; pays = décodéunicode (pays); // pause du pays; Cas 3: Area = (temp [i] .split (":")) [1] .replaceAll ("/" "," "); area = decodeunicode (zone); // région de la région; cas 5: région = (temp [i] .split (": ")) [1] .replaceall (" / "", ""); région = décodéunicode (région); // Break de la province; Cas 7: City = (temp [i] .split (":")) [1] .replaceAll ("/" "," "); City = DecodeUnicode (City); // City Break; cas 9: comté = (temp [i] .split (": ")) [1] .replaceall (" / "", ""); comté = décodéunicode (comté); // pause région; Cas 11: ISP = (temp [i] .split (":")) [1] .replaceALL ("/" "," "); ISP = DECODEUNICODODE (ISP); // ISP Company Break;}} System.out.println (Country + Area + Region + City + County + ISP); Retour New StringBuffer (Pays) .APPED (Area) .Apnd (région) .APPENDRE (CITY) .APPEL (COMTÉ). GBK, UTF-8, etc. * @return * / private GetResult (String Urlstr, String Content, String Encoding) {url url = null; connection.setConnectTimeout (2000); // définir le temps de temps mort de connexion en milliseconds connection.setReadTimeout (33000); /// définir le délai de lecture des données de lecture, en milliseconds connection.setDoOutput (true); Post | Get Connection.SetUsecaches (false); // Si pour cache true | false connection.connect (); // Ouvrez le port de connexion DataOutStream Out = new DataOutputStream (connection.getOutputStream ()); // Ouvrez le flux de sortie et écrivez des données à Peer Server Out.WriteBytes (contenu); // Écriture de données, c'est-à-dire votre formulaire out.flush (); // rafraîchir out.close (); // Fermez le flux de sortie BufferedReader Reader = new BufferedReader (new InputStreamReader (Connection.getInputStream (), Encoding)); // après avoir écrit des données à Peer Server, Return Data //, Utilisez le Stream Buffereder To Read StringBuffer = New StringBuffer ();); Chaîne line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } reader.close (); retour tamper.toString (); } catch (ioException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.disconnect (); // Fermer la connexion}} return null; } / ** * Unicode Convert en chinois * * @author fanhui 2007-3-15 * @param thestring * @return * / public static static dedecodeunicode (String thestring) {char achar; int len = thestring.length (); StringBuffer OutBuffer = new StringBuffer (Len); pour (int x = 0; x <len;) {achar = thestring.charat (x ++); if (achar == '//') {achar = thestring.charat (x ++); if (achar == 'u') {int value = 0; pour (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': value = (valeur << 4) + ACHAR - '0'; casser; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': valeur = (valeur << 4) + 10 + achar - 'a'; casser; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': valeur = (valeur << 4) + 10 + achar - 'a'; casser; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': valeur = (valeur << 4) + 10 + achar - 'a'; casser; Par défaut: lancez un nouveau IllégalArgumentException ("Encodage malformé."); }} undbuffer.append (((char) value); } else {if (achar == 't') {achar = '/ t'; } else if (achar == 'r') {achar = '/ r'; } else if (achar == 'n') {achar = '/ n'; } else if (achar == 'f') {achar = '/ f'; } undbuffer.append (ACHAR); }} else {undbuffer.append (achar); }} return undbuffer.toString (); } // Tester public static void main (String [] args) {AddressUtils AddressUtils = new AddressUtils (); // tester IP 219.136.134.157 Chine = South China = Province du Guangdong = Guangzhou City = District de Yuexiu = Télécom String ip = "125.70.11.136"; String Address = ""; essayez {adresse = adresses.getAddress ("ip =" + ip, "utf-8"); } catch (UnportEnCoDingException e) {// Bloc de catch généré automatiquement de TODO E.PrintStackTrace (); } System.out.println (adresse); // Le résultat de la production est: la province du Guangdong, Guangzhou City, district de Yuexiu}}