Recentemente, uma certa função do projeto precisa obter uma localização geográfica detalhada de uma interface de terceiros com base no endereço IP. Eu encontrei muitos exemplos da Internet, incluindo Sina, Taobao e Tencent. Eu tentei Taobao. Se for uma pequena ordem de magnitude, está tudo bem. Se atingir um nível de 100.000, a velocidade será lenta, o que fará com que o sistema falhe. O exemplo a seguir é de Sina. O exemplo não é adequado para cada projeto e precisa ser modificado.
/** iPsearchurl = http: //int.dpool.sina.com.cn/iplookup/iplookup.php? formato = js & ip = (este é o endereço de interface do Sina) no projeto, o endereço da interface do Sina não é escrito diretamente, mas o arquivo de atributo é lido. */ public static string getipinfobysina (string ip) {// Leia o arquivo de atributo (Propriedade do arquivo-chave e formato) Final String prop_ipsEarchurl = "iPsearchurl"; final string ret_success = "1"; String final ret = "ret"; Província final da String = "Província"; Final String City = "City"; Final String District = "Distrito"; Final String ISP = "ISP"; String ipaddress = ""; if (stringutils.isblank (ip)) {return null; } String url = SystemParamPropertyutils.getSystemParamKeyValue (prop_ipsEarchurl); // Isso é para obter o URL do arquivo de propriedades, ou seja, endereço da interface sina se (stringUtils.isnotblank (url)) {string caminho = url+ip; // "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip="+ip; HttpClient httpClient = new HttpClient (); Mapa <string, string> parammap = new hashmap <string, string> (); String remoteipinfo = ""; tente {remoteipinfo = httpclientUtil.request (httpclient, caminho, parammap, "sina"); } catch (Exceção e) {e.printStackTrace (); } if (stringutils.isnotblank (remoteipinfo)) {string _ret = SearchValue (remoteipinfo, ret); if (ret_success.equals (_ret)) {string provinceName = searchValue (remoteipinfo, província); String cityName = SearchValue (remoteipinfo, cidade); String District = SearchValue (remoteipinfo, distrito); String isp = SearchValue (remoteipinfo, ISP); ipaddress = provincename+cityName+distrito+ISP; }}} retornar ipaddress; } String estática privada SearchValue (String Remoteipinfo, tecla String) {String _Value = ""; if (stringUtils.isnotblank (remoteipinfo)) {_value = stringUtils.substringBetween (remoteipinfo, "/" "+key+"/":", ","); if (stringutils.isnotblank (_value)) {_value = unicodeutils.decodeunicode (_value); }} retornar _value; } Eu li o endereço da interface do Sina muito rapidamente. Eu o testei por cerca de 90.000, dez minutos. Para o Taobao, mais de uma hora, mais de 50.000 peças. Há outro truque, que é salvar o IP de leitura no mapa e, em seguida, retire -o diretamente do mapa se você o ler na próxima vez, o que for muito mais rápido. Isso levará a muitos problemas. Quando os arquivos de log atingem milhões ou dezenas de milhões, como resolvê -los? Para exemplos como o Taobao, cada ordem é diferente em número de ordens em um segundo. Não sei como resolvê -lo. Algum grande Deus sabe para me responder.
O seguinte é Taobao.
importar java.io.bufferedReader; importar java.io.dataoutputStream; importar java.io.ioException; importar java.io.inputStreamReader; importar java.io.unsupportEdEncodingException; import java.httpurlconnection; importação java.n; @Author lwl * @datejan 26, 2016 * /public classe ADDERETULS { /** * @Param Content * O formato de parâmetro solicitado é: nome = xxx & pwd = xxx * @param codificação * codificação de solicitação do lado do servidor. Por exemplo, GBK, UTF-8, etc. * @RETURN * @THOWS UNSUPORPORTEDENCODINGINGEXCECTIONS */public String getAddresses (conteúdo da String, String EncodingString) lança UnsupportEdEncodingException {// Chame a interface pconline string = "http:/p.taobao.com/soba.com/pconlines string urlstr =" http:/p.taobao.com/soBa.com/soBo.com/soverful/ponlines; // Obtenha as informações da província, cidade e distrito, onde o IP está localizado em http://whois.pconline.com.cn string return = this.getResult (urlstr, content, codingString); if (returnstr! = null) {// Processe o sistema de informação provincial e municipal retornado.out.println (returnStr); String [] temp = returnstr.split (","); if (temp.length <3) {return "0"; // IP inválido, teste LAN} Region = (temp [5] .split (":")) [1] .Replaceall ("/" "", "; ""; país = decodeunicode (país); // países do país; Caso 3: Área = (Temp [i] .Split (":")) [1] .Replaceall ("/" "," "); área = decodeunicode (área); // quebra de região; caso 5: região = (temp [i] .split (": ") [1].. região = decodeunicode (região); // quebra de província; Caso 7: Cidade = (temp [i] .Split (":")) [1] .Replaceall ("/" "," "); City = decodeunicode (cidade); // Break; Condado = decodeunicode (condado); // quebra de região; Caso 11: ISP = (temp [i] .split (":")) [1] .Replaceall ("/" "," "); iSp = decodeunicode (ISP); // ISP Company Break;}} System.out.println (país+região+cidade+município+condado+isp); retorno novo StringBuffer (País). Append (Area) .Append (Region) .Append (City) .Append (County) .Append (ISP) .ToString (); GBK, UTF-8, etc. * @return */ String privada GetResult (String URLST, String Content, String Encoding) {Url Url = NULL; Connection.setConnectTimeout (2000); // Defina o tempo de tempo limite da conexão em milissegundos Connection.SetReadTimeOut (33000); /// Defina o tempo limite para ler dados, em MillisEconds Connection.setdoOutput (true); // se deve abrir o fluxo de saída | False Connection. Método postagem | Obtenha conexão.SetUseCaches (false); // Se deve cache true | false conexão.connect (); // Abra a porta de conexão DataOutputStream Out = new DataOutputStream (Connection.getOuttutStream (); // Abra o fluxo de saída e a gravação de dados para o servidor peer. out.flush (); // atualizar.close (); // Fechar o fluxo de saída BufferReader Reader = new BufferredReader (new InputStreamReader (Connection.getInputStream (), Encoding)); // Após escrever dados no servidor Peer, retornar dados //, use o buffer de lader para leitura para leitura stringber = stringbfer =; String line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } leitor.close (); retornar buffer.toString (); } catch (ioexception e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.disconnect (); // feche a conexão}} retorna null; } / * * 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 = (valor << 4) + achar - '0'; quebrar; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (valor << 4) + 10 + achar - 'a'; quebrar; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (valor << 4) + 10 + achar - 'a'; quebrar; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (valor << 4) + 10 + achar - 'a'; quebrar; Padrão: jogue novo ilegalargumentException ("codificação malformada".); }} outbuffer.append ((char) valor); } 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); }} retorna outbuffer.toString (); } // Teste public static void main (string [] args) {ADDENDUTILS ADDENDUTILS = new ADDERTULS (); // Teste IP 219.136.134.157 China = sul da China = Província de Guangdong = cidade de Guangzhou = distrito de Yuexiu = String de Telecom IP = "125.70.11.136"; Endereço de string = ""; tente {endereço = endereços.getAddresses ("ip ="+ip, "utf-8"); } Catch (UnsupportEdEnCodingException e) {// TODO BLOCO DE CATAGEM AUTOGERATO E.PRINTSTACKTRACE (); } System.out.println (endereço); // O resultado da saída é: Província de Guangdong, cidade de Guangzhou, distrito de Yuexiu}}