เมื่อเร็ว ๆ นี้ฟังก์ชั่นบางอย่างของโครงการจำเป็นต้องได้รับที่ตั้งทางภูมิศาสตร์โดยละเอียดจากอินเทอร์เฟซของบุคคลที่สามตามที่อยู่ IP ฉันได้พบตัวอย่างมากมายจากอินเทอร์เน็ตรวมถึง Sina, Taobao และ Tencent ฉันลอง Taobao ถ้ามันมีขนาดเล็ก ๆ ก็โอเค หากถึงระดับ 100,000 ความเร็วจะช้าลงซึ่งจะทำให้ระบบล้มเหลว ตัวอย่างต่อไปนี้มาจาก Sina ตัวอย่างไม่เหมาะสำหรับแต่ละโครงการและจำเป็นต้องแก้ไข
/** 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"; สตริงสุดท้าย = "จังหวัด"; Final String City = "City"; String District สุดท้าย = "District"; สตริงสุดท้าย ISP = "ISP"; String iPaddress = ""; if (stringutils.isblank (ip)) {return null; } string url = systemparampropertyutils.getsystemparamkeyValue (prop_ipsearchurl); // นี่คือการรับ URL จากไฟล์คุณสมบัตินั่นคือที่อยู่อินเทอร์เฟซ SINA ถ้า (stringutils.isnotblank (url)) path = url+ip; // "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip="+IP; httpClient httpClient = new httpClient (); แผนที่ <สตริง, สตริง> parammap = ใหม่ hashmap <สตริง, สตริง> (); String remoteIpinfo = ""; ลอง {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)) {สตริง provincename = searchValue (remoteipinfo, จังหวัด); String CityName = SearchValue (RemoteIpinfo, City); String District = SearchValue (RemoteIpinfo, District); สตริง isp = searchValue (remoteipinfo, ISP); iPaddress = Provincename+CityName+District+ISP; }}} ส่งคืน iPaddress; } String Private String SearchValue (สตริง remoteIpinfo, คีย์สตริง) {สตริง _value = ""; if (stringutils.isnotblank (remoteipinfo)) {_value = stringutils.substringbetween (remoteipinfo, "/" "+key+"/":", ","); if (stringutils.isnotblank (_value)) {_value = unicodeutils.decodeunicode (_value); }} return _value; - ฉันอ่านที่อยู่อินเทอร์เฟซ SINA ได้อย่างรวดเร็ว ฉันทดสอบประมาณ 90,000 สิบนาที สำหรับ Taobao มากกว่าหนึ่งชั่วโมงมากกว่า 50,000 ชิ้น มีเคล็ดลับอีกอย่างหนึ่งคือการบันทึก IP อ่านลงในแผนที่แล้วนำออกจากแผนที่โดยตรงหากคุณอ่านในครั้งต่อไปซึ่งเร็วกว่ามาก สิ่งนี้จะนำไปสู่ปัญหามากมาย เมื่อไฟล์บันทึกถึงหลายล้านหรือหลายสิบล้านวิธีการแก้ปัญหาได้อย่างไร? ตัวอย่างเช่น Taobao แต่ละคำสั่งซื้อจะแตกต่างกันในจำนวนคำสั่งซื้อในหนึ่งวินาที ฉันไม่รู้วิธีแก้ปัญหา พระเจ้าผู้ยิ่งใหญ่บางคนรู้ว่าจะตอบกลับฉัน
ต่อไปนี้คือ Taobao
นำเข้า java.io.bufferedreader; นำเข้า java.io.dataOutputStream; นำเข้า java.io.ioException; นำเข้า java.io.InputStreamReader; นำเข้า Java.io.unsupportedencodexception; นำเข้า Java.net.httpurlconnection; @author lwl * @datejan 26, 2016 * /ที่อยู่คลาสสาธารณะ addressUtils { /** * เนื้อหา @param * รูปแบบพารามิเตอร์ที่ร้องขอคือ: name = xxx & pwd = xxx * @param encoding * การเข้ารหัสคำขอด้านเซิร์ฟเวอร์ ตัวอย่างเช่น gbk, utf-8 ฯลฯ * @return * @throws unsupportencodingexception */สตริงสาธารณะ getAddresses (เนื้อหาสตริง, การเข้ารหัสสตริง) พ่น unsupportencodexception {// เรียก pconline อินเตอร์เฟสสตริง urlstr = "http: // รับข้อมูลของจังหวัดเมืองและเขตที่ IP ตั้งอยู่จาก http://whois.pconline.com.cn สตริง returnstr = this.getResult (urlstr, เนื้อหา, การเข้ารหัส); if (returnstr! = null) {// ประมวลผลระบบข้อมูลจังหวัดและเทศบาลที่ส่งคืนกลับมา String [] temp = returnstr.split (","); if (temp.length <3) {return "0"; // IP ไม่ถูกต้อง, LAN TEST} String region = (temp [5] .split (":")) [1] .replaceall ("/" ","); ภูมิภาค = decodeunicode (ภูมิภาค); ""; สำหรับ (int i = 0; i <temp.length; i ++) {switch (i) {กรณี 1: country = (temp [i] .split (":") [2] .replaceall ("/" ","); ประเทศ = decodeunicode (ประเทศ); // การแบ่งประเทศ; กรณีที่ 3: พื้นที่ = (อุณหภูมิ [i] .split (":")) [1] .replaceall ("/" "," "); พื้นที่ = decodeunicode (พื้นที่); // การแบ่งภูมิภาค; กรณีที่ 5: ภูมิภาค = (temp [i] .split (": ") [1] ภูมิภาค = decodeunicode (ภูมิภาค); // การแบ่งจังหวัด; กรณีที่ 7: เมือง = (อุณหภูมิ [i] .split (":")) [1] .replaceall ("/" "," "); เมือง = decodeunicode (เมือง); // เมืองหยุด; กรณีที่ 9: มณฑล = (อุณหภูมิ [i] .Split (": ")) [1] มณฑล = decodeunicode (เคาน์ตี); // การแบ่งภูมิภาค; กรณีที่ 11: isp = (temp [i] .split (":")) [1] .replaceall ("/" "," "); isp = decodeunicode (ISP); // ISP BREAK;}} System.out.println StringBuffer (Country). APPENT (พื้นที่). APPENT (ภูมิภาค). APPENT (CITY). APPENT (COUNTY). APPENT (ISP) .ToString (); UTF-8 ฯลฯ * @return */ สตริงส่วนตัว getResult (สตริง urlstr, เนื้อหาสตริง, การเข้ารหัสสตริง) {url url = null; ตั้งค่าเวลาการหมดเวลาการเชื่อมต่อในการเชื่อมต่อมิลลิวินาที SetReadTimeout (33000); /// ตั้งค่าหมดเวลาสำหรับการอ่านข้อมูลในการเชื่อมต่อมิลลิวินาที SetDoOutput (จริง); // ว่าจะเปิดกระแสเอาต์พุตจริง | การเชื่อมต่อเท็จ Connection.setUsecaches (false); // ไม่ว่าจะเป็นแคชจริง | การเชื่อมต่อเท็จ connect.connect (); // เปิดพอร์ตการเชื่อมต่อ DataOutputStream ออก = ใหม่ dataOutputStream (Connection.getOutputStream ()); // เปิดกระแสเอาต์พุตและข้อมูลเขียนไปยังเซิร์ฟเวอร์ peer.writebytes (เนื้อหา); รีเฟรช out.close (); // ปิด output stream bufferedReader reader = new bufferedReader (ใหม่ inputStreamReader (Connection.getInputStream (), การเข้ารหัส)); // หลังจากเขียนข้อมูลไปยังเซิร์ฟเวอร์เพียร์ให้ส่งคืนข้อมูล // ใช้ bufferedreader stream สตริงบรรทัด = ""; ในขณะที่ ((line = reader.readline ())! = null) {buffer.append (บรรทัด); } reader.close (); return buffer.toString (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.disconnect (); // ปิดการเชื่อมต่อ}} ส่งคืน null; } / ** * Unicode แปลงเป็นภาษาจีน * * @author Fanhui 2007-3-15 * @param thestring * @return * / public String decodeunicode (String 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 ++); สวิตช์ (achar) {กรณี '0': กรณี '1': กรณี '2': กรณี '3': กรณี '4': กรณี '5': กรณี '6': กรณี '7': กรณี '8': กรณี '9': value = (ค่า << 4) + Achar - '0'; หยุดพัก; กรณี 'a': กรณี 'b': กรณี 'c': กรณี 'd': กรณี 'e': กรณี 'f': value = (ค่า << 4) + 10 + achar - 'a'; หยุดพัก; กรณี 'a': กรณี 'b': กรณี 'c': กรณี 'd': กรณี 'e': กรณี 'f': value = (ค่า << 4) + 10 + achar - 'a'; หยุดพัก; กรณี 'a': กรณี 'b': กรณี 'c': กรณี 'd': กรณี 'e': กรณี 'f': value = (ค่า << 4) + 10 + achar - 'a'; หยุดพัก; ค่าเริ่มต้น: โยน unlegalargumentException ใหม่ ("การเข้ารหัสแบบไม่ลงรอยกัน"); }} outbuffer.append ((ถ่าน) ค่า); } else {ถ้า (achar == 't') {achar = '/t'; } อื่นถ้า (achar == 'r') {achar = '/r'; } อื่นถ้า (achar == 'n') {achar = '/n'; } อื่นถ้า (achar == 'f') {achar = '/f'; } outbuffer.append (achar); }} else {outbuffer.append (achar); }} return outbuffer.toString (); } // ทดสอบโมฆะสาธารณะคงที่หลัก (สตริง [] args) {addressUtils addressUtils = addressUtils ใหม่ (); // ทดสอบ IP 219.136.134.157 จีน = จีนใต้ = มณฑลกวางตุ้ง = เมืองกวางโจว = เขต Yuexiu = โทรคมนาคมสตริง IP = "125.70.11.136"; String address = ""; ลอง {address = addressutils.getAddresses ("ip ="+ip, "UTF-8"); } catch (unsupportencodingexception e) {// toDo บล็อก catch ที่สร้างโดยอัตโนมัติ E.PrintStackTrace (); } system.out.println (ที่อยู่); // ผลลัพธ์ผลลัพธ์คือ: มณฑลกวางตุ้ง, เมืองกวางโจว, เขต Yuexiu}}}