في الآونة الأخيرة ، تحتاج وظيفة معينة للمشروع إلى الحصول على موقع جغرافي مفصل من واجهة طرف ثالث بناءً على عنوان IP. لقد وجدت العديد من الأمثلة من الإنترنت ، بما في ذلك Sina و Taobao و Tencent. جربت Taobao ، إذا كان ترتيبًا صغيرًا من حيث الحجم ، فهو على ما يرام ، ولكن إذا وصل إلى مستوى 100000 ، فستكون السرعة بطيئة ، مما سيؤدي إلى تعطل النظام. المثال التالي من سينا. المثال غير مناسب لكل مشروع ويجب تعديله.
/** ipsearchurl = http: //int.dpool.sina.com.cn/iplookup/iplookup.php؟ format = JS & IP = (هذا هو عنوان واجهة Sina) في المشروع ، لا يتم كتابة عنوان واجهة Sina مباشرة ، ولكن يتم قراءة ملف السمة. */ سلسلة ثابتة عامة getipinfobysina (سلسلة IP) {// اقرأ ملف السمة (قيمة مفتاح ملف الخصائص والتنسيق) السلسلة النهائية prop_ipsearchurl = "ipsearchurl" ؛ السلسلة النهائية ret_success = "1" ؛ السلسلة النهائية ret = "ret" ؛ السلسلة النهائية Province = "Province" ؛ String City = "City" ؛ سلسلة نهائية = "المنطقة" ؛ السلسلة النهائية ISP = "ISP" ؛ سلسلة ipaddress = "" ؛ if (stringUtils.isblank (IP)) {return null ؛ } url url = systemparampropertyUtils.getSystemParamKeyValue (prop_ipsearchurl) ؛ // هذا هو الحصول على عنوان URL من ملف الخصائص ، أي عنوان واجهة sina if (stringUtils.isnotblank (url)) {String string) path = url+ip ؛ // "http://int.dpool.sina.com.cn/iplookup/iplookup.php؟format=js&ip="+ip ؛ httpclient httpclient = new httpclient () ؛ خريطة <string ، string> parammap = new hashmap <string ، string> () ؛ سلسلة remoteipinfo = "" ؛ جرب {remoteipinfo = httpclientutil.request (httpclient ، path ، parammap ، "sina") ؛ } catch (استثناء 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) ؛ سلسلة ISP = SearchValue (Remoteipinfo ، ISP) ؛ ipaddress = provincename+cityName+District+ISP ؛ }}} إرجاع ipaddress ؛ } SearchValue static static static (سلسلة remoteipinfo ، مفتاح السلسلة) {string _value = "" ؛ if (stringUtils.isnotBlank (Remoteipinfo)) {_value = stringUtils.subStringBetween (Remoteipinfo ، "/"+key+"/": "،") ؛ if (stringUtils.isNotBlank (_value)) {_value = unicodeutils.decodeUnicode (_value) ؛ }} return _value ؛ } قرأت عنوان واجهة سينا بسرعة كبيرة. لقد اختبرته لنحو 90،000 وعشر دقائق. بالنسبة إلى Taobao ، أكثر من ساعة ، أكثر من 50000 قطعة. هناك خدعة أخرى ، وهي حفظ IP للقراءة في الخريطة ، ثم أخرجها مباشرة من الخريطة إذا قرأتها في المرة القادمة ، وهي أسرع بكثير. هذا سوف يؤدي إلى العديد من المشاكل. عندما تصل ملفات السجل إلى مستوى الملايين أو عشرات الملايين ، كيفية حلها؟ للحصول على أمثلة مثل Taobao ، يختلف كل طلب في عدد الطلبات في ثانية واحدة. لا أعرف كيفية حلها. بعض الله العظيم يعلم الرد علي.
ما يلي هو taobao.
استيراد java.io.bufferedreader ؛ استيراد java.io.dataoutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstreamread ؛ استيراد java.io.unsupportedencodingexception ؛ استيراد java.net.httpurlconnection ؛ عنوان IP * Author lwl * datejan 26 ، 2016 * /address addressils { /** * param content * تنسيق المعلمة المطلوبة هو: name = xxx & pwd = xxx * param التشفير * طلب ترميز جانب الخادم. على سبيل المثال ، GBK ، UTF-8 ، إلخ. // احصل على معلومات المقاطعة والمدينة والمنطقة حيث يقع IP من http://whois.pconline.com.cn String Returnstr = this.getResult (urlstr ، المحتوى ، الترميز) ؛ if (returnstr! = null) {// معالجة نظام المعلومات المقاطعة والبلدية العائدين. String [] temp = returnstr.split ("،") ؛ if (temp.length <3) {return "0" ؛ // IP غير صالح ، اختبار LAN} region region = (temp [5] .Split (":")) [1] "" ؛ Country = decodeunicode (Country) ؛ // Country Break ؛ الحالة 3: المنطقة = (temp [i] .split (":")) [1] .replaceall ("/" "،" ") ؛ area = decodeunicode (area) ؛ // region break ؛ case 5: region = (temp [i] .split (: المنطقة = decodeunicode (المنطقة) ؛ // استراحة المقاطعة ؛ الحالة 7: City = (temp [i] .split (":")) [1] مقاطعة = decodeunicode (مقاطعة) ؛ // استراحة المنطقة ؛ الحالة 11: ISP = (temp [i] .split (":")) [1] StringBuffer (Country). GBK ، UTF-8 ، connection.setConnectTimeout (2000) ؛ // قم بتعيين وقت المهلة في الاتصال في milliseconds connection.setReadTimeout (33000) ؛ /// قم بتعيين مهلة قراءة البيانات ، في milliseconds connection.setDoOutput (true) ؛ // post | الحصول على اتصال. out.flush () ؛ // refresh out.close () ؛ // أغلق دفق الإخراج bufferedreader reader = جديد bufferedReader (new inputStreamReader (connection.getInputStream () ، الترميز)) ؛ خط السلسلة = "" ؛ بينما ((line = reader.ReadLine ())! = null) {buffer.append (line) ؛ } reader.close () ؛ إرجاع buffer.toString () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {if (connection! = null) {connection.disconnect () ؛ // أغلق الاتصال}} return null ؛ } / ** * unicode تحويل إلى صيني * * Author fanhui 2007-3-15 * param thestring * @return * / public static string decodeunicode (سلسلة thestring) {char achar ؛ int len = thestring.length () ؛ StringBuffer OutBuffer = جديد StringBuffer (LEN) ؛ لـ (int x = 0 ؛ x <len ؛) {achar = thestring.charat (x ++) ؛ if (achar == '//') {Achar = thestring.charat (x ++) ؛ if (achar == 'u') {int value = 0 ؛ لـ (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' ؛ استراحة؛ الحالة "A": CASE "B": CASE "C": CASE "D": CASE "E": CASE "F": value = (value << 4) + 10 + Achar - 'a' ؛ استراحة؛ الحالة "A": CASE "B": CASE "C": CASE "D": CASE "E": CASE "F": value = (value << 4) + 10 + Achar - 'a' ؛ استراحة؛ الحالة "A": CASE "B": CASE "C": CASE "D": CASE "E": CASE "F": value = (value << 4) + 10 + Achar - 'a' ؛ استراحة؛ الافتراضي: رمي جديد غير شرعي ("تشفير مشوه".) ؛ }} outbuffer.append ((char) value) ؛ } آخر {if (achar == 't') {achar = '/t' ؛ } آخر إذا (achar == 'r') {achar = '/r' ؛ } آخر إذا (achar == 'n') {achar = '/n' ؛ } آخر إذا (achar == 'f') {achar = '/f' ؛ } outbuffer.append (Achar) ؛ }} آخر {outbuffer.append (achar) ؛ }} return Outbuffer.toString () ؛ }. // اختبار IP 219.136.134.157 الصين = جنوب الصين = مقاطعة قوانغدونغ = مدينة قوانغتشو = منطقة Yuexiu = سلسلة الاتصالات IP = "125.70.11.136" ؛ عنوان السلسلة = "" ؛ حاول {address = addressUtils.getAdDresses ("ip ="+ip ، "utf-8") ؛ } catch (UnsupportedEncodingException e) {// todo catch catch e.printstacktrace () ؛ } system.out.println (العنوان) ؛ // نتيجة الإخراج هي: مقاطعة قوانغدونغ ، مدينة قوانغتشو ، مقاطعة Yuexiu}}}