Недавно определенная функция проекта должна получить подробное географическое местоположение от стороннего интерфейса на основе IP-адреса. Я нашел много примеров из Интернета, включая Sina, Taobao и Tencent. Я попробовал Таобао. Если это небольшой порядок, это нормально. Если он достигнет уровня 100 000, скорость будет медленной, что приведет к сбою системы. Следующий пример от Sina. Пример не подходит для каждого проекта и должен быть изменен.
/** ipsearchurl = http: //int.dpool.sina.com.cn/iplookup/iplookup.php? format = js & ip = (это адрес интерфейса Sina) В проекте адрес интерфейса Sina не написан напрямую, но файл атрибута читается. */ public static String getipinFobysina (String ip) {// Читать файл атрибута (значение ключа файла свойства и формат) final String prop_ipsearchurl = "ipsearchurl"; окончательная строка ret_success = "1"; окончательная строка ret = "ret"; Final String Province = "провинция"; final String City = "City"; окончательный строки District = "District"; окончательная строка ISP = "ISP"; String iPaddress = ""; if (stringutils.isblank (ip)) {return null; } String url = SystemParamProperTyUtils.getSystemParamKeyValue (prop_ipsearchUrl); // Это для получения URL из файла свойств, то есть адрес интерфейса sina if (stringUtils.isnotblank (url)) {строка 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 = ""; try {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 provinceename = searchvalue (remoteipinfo, province); String CityName = SearchValue (RemoteIpinfo, City); String District = searchValue (remoteipinfo, District); String isp = searchValue (remoteipinfo, ISP); iPaddress = имена провинции+CityName+District+ISP; }}} вернуть iPaddress; } частная статическая строка SearchValue (string remoteipinfo, string key) {string _value = ""; if (stringUtils.isnotblank (remoteipinfo)) {_value = stringutils.substringweed (remoteipinfo, "/" "+key+"/":", ","); if (stringutils.isnotblank (_value)) {_value = Unicodeutils.decodeunicode (_value); }} return _value; } Я очень быстро читаю адрес интерфейса Sina. Я проверил его около 90 000, десять минут. Для Taobao более часа, более 50 000 штук. Есть еще один трюк, который состоит в том, чтобы сохранить IP Read в карту, а затем вывести его непосредственно с карты, если вы прочитаете его в следующий раз, что намного быстрее. Это приведет ко многим проблемам. Когда файлы журнала достигают миллионов или десятков миллионов, как их решить? Для таких примеров, как Taobao, каждый заказ отличается по количеству заказов за одну секунду. Я не знаю, как это решить. Какой -то великий Бог знает, чтобы ответить мне.
Ниже приведено Таобао.
Импорт java.io.bufferedReader; Import java.io.dataoutputStream; импорт java.io.ioexception; import java.io.inputStreamReader; импорт java.io.unsupportedEncodingExcept @author lwl * @datejan 26, 2016 * /public class addrestils { /** * @param Content * Запрашиваемый формат параметров: name = xxx & pwd = xxx * @param enhoding * eNefing Side Side. Например, GBK, UTF-8 и т. Д. * @return * @Throws UnsupportedEncodingException */public String getAddresses (строковое содержимое, строковые энкодингстры) бросает UnsupportedEncodingException {// Call Interface Interface unclstr = "http://ip.taobao.com/service/getipinfo.ph // Получить информацию о провинции, городе и округе, где IP расположен от http://whois.pconline.com.cn stringstr = this.getresult (urlstr, content, encodingstring); if (returnstr! = null) {// обработать возвращенную провинциальную и муниципальную информационную систему.out.println (returnstr); String [] temp = returnstr.split (","); if (temp.length <3) {return "0"; // недействительный ip, тест LAN} string region = (temp [5] .split (":")) [1] .replaceall ("/" "," "); region = decodeunicode (region); // province country ="; "; string ="; // string region = ";"; ""; страна = decodeunicode (страна); // перерыв в стране; Случай 3: область = (temp [i] .split (":")) [1] .replaceall ("/" "," "); area = decodeunicode (область); // разрыв области; случай 5: область = (temp [i] .split (": ")) [1] .replaceAll ("/",", "); область = decodeunicode (область); // провинция разрыв; Случай 7: City = (temp [i] .split (":")) [1] .replaceall ("/" "," "); City = decodeunicode (City); // City Break; случай 9: County = (i] .split (": ")) [1] .RplaceAll ("/",", "); County = decodeunicode (округ); // перерыв в регионе; Случай 11: isp = (temp [i] .split (":")) [1] .replaceall ("/" "," "); Isp = decodeunicode (ISP); // Break Company Isp;}} System.out.println (страна+район+город+округ+isp); StringBuffer (страна). Приложение (область). Приложение (регион). Приложение (город). GBK, UTF-8 и т. Д. connection.setConnecttimeout (2000); // Установить время времени ожидания подключения в Milliseconds Connection.SetReadTimeOut (33000); /// Установить время ожидания для чтения данных, в Milliseconds Connection.SetDoOutput (TRUE); // Будь то открыть выходной поток true POST | GET CONNECTION.SetUSECACHES (false); // Будь то кэшировать true | false connection.connect (); // Открыть порт подключения DataOutputStream Out = new DataOutputStream (connection.getOutputStream ()); // Открыть выходные данные и записать данные на сервер PEER. out.flush (); // revely out.close (); // Закройте выходной поток BufferedReader Reader = New BufferedReader (новый inputStreamReader (connection.getInputStream (), кодирование)); // После написания данных на сервер PEER (вернуть данные //, используйте поток BufferedReader для чтения StringBuffer Buffer = new StringBuffer (); String line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } reader.close (); return 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 (String thestring) {char achar; int len = thestring.length (); StringBuffer Outbuffer = new StringBuffer (Len); for (int x = 0; x <len;) {achar = thestring.charat (x ++); if (achar == '//') {achar = thestring.charat (x ++); if (achar == 'u') {int value = 0; for (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'; перерыв; по умолчанию: бросить новое allogalargumentException («Уродство кодировки»); }} utbuffer.append ((char) значение); } 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 utbuffer.toString (); } // Проверка публичной статической void main (string [] args) {addrestils addressutils = new addressutils (); // тест IP 219.136.134.157 Китай = Южный Китай = Гуандонг провинция = Гуанчжоу Сити = район yuexiu = телекоммуникационная строка ip = "125.70.11.136"; String address = ""; try {address = addrestils.getaddresses ("ip ="+ip, "UTF-8"); } catch (unsupportedencodingexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } System.out.println (адрес); // Результат вывода: провинция Гуандун, город Гуанчжоу, район Юэксиу}}