In jüngster Zeit muss eine bestimmte Funktion des Projekts einen detaillierten geografischen Standort von einer Schnittstelle von Drittanbietern basierend auf der IP-Adresse erhalten. Ich habe viele Beispiele aus dem Internet gefunden, darunter Sina, Taobao und Tencent. Ich habe Taobao ausprobiert, wenn es sich um eine kleine Größenordnung handelt, ist es in Ordnung, aber wenn es einen Niveau von 100.000 erreicht, ist die Geschwindigkeit langsam, was dazu führt, dass das System abstürzt. Das folgende Beispiel stammt von Sina. Das Beispiel ist für jedes Projekt nicht geeignet und muss geändert werden.
/** ipsearchurl = http: //int.dpool.sina.com.cn/iplookup/iplookup.php? format = js & ip = (dies ist die Schnittstellenadresse von Sina) Im Projekt wird die Schnittstellenadresse von Sina nicht direkt geschrieben, aber die Attributdatei wird gelesen. */ public static String getiPInfObysina (String ip) {// Lesen Sie die Attributdatei (Eigenschaftsdateischlüsselwert und Format) Finale String prop_ipsearchurl = "ipsearchUrl"; endgültige String ret_success = "1"; endgültige String ret = "ret"; Finale String Provinz = "Provinz"; Finale String City = "City"; Final String District = "District"; endgültige String isp = "isp"; String iPaddress = ""; if (stringutils.isblank (ip)) {return null; } String url = systemparampropertyutils.getSystemParamkeyValue (prop_ipsearchurl); // Dies soll die URL aus der Eigenschaftendatei erhalten, dh Sina -Schnittstellenadresse 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 (); Karte <String, String> parammap = new HashMap <String, String> (); String remoteipinfo = ""; try {remoteipinfo = httpclientUtil.request (httpclient, Pfad, Parammap, "Sina"); } catch (Ausnahme e) {e.printstacktrace (); } if (stringutils.isnotblank (remoteipinfo)) {string _ret = searchValue (remoteipinfo, ret); if (ret_success.equals (_ret)) {String provincename = searchValue (remoteipinfo, Provinz); String CityName = SearchValue (remoteipinfo, Stadt); String District = SearchValue (remoteipinfo, District); String isp = SearchValue (remoteipinfo, ISP); ipaddress = provincename+CityName+District+ISP; }}} return iPaddress; } private statische String -SearchValue (String remoteipinfo, String -Schlüssel) {String _value = ""; if (stringutils.isnotblank (remoteipinfo)) {_value = stringils.substringbetween (remoteipinfo, "/" "+key+"/":", ","); if (stringutils.isnotblank (_value)) {_value = unicodeUtils.decodeunicode (_Value); }} return _Value; } Ich habe die Sina -Schnittstellenadresse sehr schnell gelesen. Ich habe es ungefähr 90.000, zehn Minuten getestet. Für Taobao, mehr als eine Stunde, mehr als 50.000 Stücke. Es gibt einen weiteren Trick, der die Lesung in der Karte speichern und sie dann direkt von der Karte herausnehmen soll, wenn Sie sie beim nächsten Mal lesen, was viel schneller ist. Dies wird zu vielen Problemen führen. Wenn die Protokolldateien das Niveau von Millionen oder Zehn Millionen von Millionen erreichen, wie kann man sie lösen? Beispiele wie Taobao unterscheidet sich jede Bestellung in der Anzahl der Bestellungen in einer Sekunde. Ich weiß nicht, wie ich es lösen soll. Ein großer Gott weiß, dass er mir antworten kann.
Das Folgende ist Taobao.
importieren java.io.bufufferedReader; import Java.io.dataoutputStream; Import Java.io.ioException; Import Java.io.inputStreamReader; @author lwl * @datejan 26, 2016 * /public class addresutils { /** * @param content * Das angeforderte Parameterformat lautet: name = xxx & pwd = xxx * @param coding * Server-Side-Anfrage-Codierung. Zum Beispiel löscht GBK, UTF-8 usw. * @Return * @Throws UnsupportedenCodingException */public String getAdDresses (String-Inhalt, String-CodingString) UnsupportedenCodingException {// Callline Interface String urstr = "http://ip.taobao.com/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/Service/GetiPinfo.hp.hp"; // Erhalten Sie die Informationen der Provinz, der Stadt und des Distrikts, in denen sich die IP von http://whois.pconline.com.cn String returnstr = this.getResult (urlstr, Inhalt, Codingstring) befindet; if (returnStr! String [] temp = returnstr.Split (","); if (temp.Length <3) {return "0"; // Ungültige IP, LAN -Test} String Region = (temp [5] .Split (":") [1] .Replaceall ("/" ","); Region = DecodeUnicode (Region); // province cunning cunning cunning cunning cunning cunning cunning coca = "; "";; Country = DecodeUnicode (Land); // Landpause; Fall 3: Area = (temp [i] .Split (":")) [1] .Replaceall ("/" "," "); Area = DecodeUnicode (Bereich); // Region Break; Fall 5: Region = (temp [i] .Ssplit (")) [1] .Replaceall ("/" "); Region = DecodeUnicode (Region); // Provinz Break; Fall 7: City = (temp [i] .Split (":")) [1] .Replaceall ("/" "," "); City = DecodeUnicode (Stadt); // City Break; Fall 9: County = (temp [i] .Ssplit (": ") [1] .Replaceall ("/""); County = DecodeUnicode (County); // Region Break; Fall 11: isp = (temp [i] .Split (":")) [1] .ReplaceAll ("/" "," "); StringBuffer (Country) .Append (Bereich) .And (Region) .And (Stadt) .And (County) .And (ISP) .ToString (); GBK, UTF-8 usw. * @Return */ private String GetResult (String urlstr, String-Inhalt, String-Codierung) {url uRl = null; Connection.setConnectTimeout (2000); // Setzen Sie die Verbindungszeitlimitzeit in Milliseconds Connection.setReadTimeout (33000); /// Die Zeitüberschreitung zum Lesen von Daten in Milliseconds Connection.SetDooutput (true); // Ob das Ausgabe Stream true | false connection.setDoinput (true); // // | // // | öffnen, | Methode post | connection. out.flush (); // aktualisiere out.close (); // den Ausgabestream BufferedReader Reader = New BufferedReader (neuer InputStreamReader (Connection.GetInputStream (), Codierung)); // Nach dem Schreiben von Daten an den Peer -Server, den Returndaten //, verwenden Sie den BufferedReader -Stream, um Stringbuffer zu lesen, um Stringbuffer zu lesen, um Stringbuffer zu lesen, um Stringbuffer zu lesen (). String line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } reader.close (); return buffer.toString (); } catch (ioException e) {e.printstacktrace (); } endlich {if (connection! = null) {connection.disconnect (); // Schließen Sie die Verbindung}} return null; } / ** * Unicode in Chinesisch konvertieren * * @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); für (int x = 0; x <len;) {Achar = thestring.charat (x ++); if (Achar == '//') {Achar = thestring.charat (x ++); if (Achar == 'u') {int value = 0; für (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 = (value << 4) + Achar - '0'; brechen; Fall 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + achar - 'a'; brechen; Fall 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + achar - 'a'; brechen; Fall 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + achar - 'a'; brechen; Standard: Werfen Sie neue IllegalArgumentException ("Missgebildete Codierung"); }} outbuffer.Append ((char) Wert); } 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 (); } // public static void main (String [] args) {adressUtils adressUtils = new addresutils (); // Testen Sie IP 219.136.134.157 China = Südchina = Guangdong Provinz = Guangzhou City = Yuexiu Distrikt = Telecom String ip = "125.70.11.136"; String address = ""; try {address = adressUtils.getAddresses ("ip ="+ip, "utf-8"); } catch (unportedenCodingException e) {// todo automatisch generierter Catch-Block e.printstacktrace (); } System.out.println (Adresse); // Das Ausgabeergebnis ist: Provinz Guangdong, City Guangzhou, Distrikt Yuexiu}}