Android: usando o endereço IP resolvido em vez do nome do host
-
28-10-2019 - |
Pergunta
Eu gostaria de usar o endereço IP resolvido para me conectar ao servidor em vez do nome do host.Aqui estão meus snippets de código:
// Get domain name from URL
String domainName = url.substring("http://".length(),
url.indexOf("/", 8));
// Get IP address as string
InetAddress inet = null;
try {
inet = InetAddress.getByName(domainName);
} catch (UnknownHostException e) {
Log.i(TAG, "The IP address cannot be resolved for " + domainName);
}
resolvedIP = inet.getHostAddress();
Aqui, consigo obter o ENDEREÇO IP com êxito.Agora tento substituir meu url conforme abaixo:
url = url.replace(domainName, resolvedIP);
Now I connect to server:
URL download = new URL(url);
conn = (HttpURLConnection) url.openConnection();
conn.getInputStream(); //Throws IO Exception
Consigo me conectar com êxito se usar o URL como está (sem substituir o nome do domínio pelo endereço IP).
Informe se estou fazendo as coisas corretamente.
Solução
Como regra geral, tente usar o URL baseado no nome do host.Não é incomum ter vários sites no mesmo IP, distinguindo-se apenas pelo nome do site (denominado hospedagem virtual).O que você está fazendo só funcionará no caso de haver um único site em um determinado IP.
É bastante comum que os balanceadores de carga tenham um IP para cada "site" que ele equilibra, mas ainda não há garantia de que você se conectará ao mesmo back-end por duas solicitações consecutivas.No entanto, existem balanceadores de carga da web que estendem o uso de hospedagem virtual até a camada de balanceamento de carga.
Eu simplesmente tentaria manter o download por um URL baseado no nome do host.
Outras dicas
Uma solução para contornar o problema do VHost é usar seu próprio servidor DNS e sempre retornar o mesmo endereço IP para o host ao qual você está se conectando.
Isso não requer alterações em seu aplicativo.