Android: uso de la dirección IP resuelta en lugar del nombre de host
-
28-10-2019 - |
Pregunta
Me gustaría usar la dirección IP resuelta para conectarme al servidor en lugar del nombre de host.Aquí están mis fragmentos 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();
Aquí puedo obtener con éxito la DIRECCIÓN IP.Ahora intento reemplazar mi URL de la siguiente manera:
url = url.replace(domainName, resolvedIP);
Now I connect to server:
URL download = new URL(url);
conn = (HttpURLConnection) url.openConnection();
conn.getInputStream(); //Throws IO Exception
Puedo conectarme correctamente si utilizo la URL como está (sin reemplazar el nombre de dominio con la dirección IP).
Por favor, avíseme si estoy haciendo las cosas correctamente.
Solución
Como regla general, intente utilizar la URL basada en el nombre de host.No es raro tener varios sitios web en la misma IP, que solo se distingue por el nombre del sitio (el llamado alojamiento virtual).Lo que está haciendo solo funcionará en el caso de que haya un solo sitio en una IP determinada.
Es bastante común que los balanceadores de carga tengan una IP para cada "sitio" que equilibran, pero aún no hay garantía de que se conecte al mismo backend para dos solicitudes consecutivas.Sin embargo, existen balanceadores de carga web que extienden el uso del alojamiento virtual hasta la capa de balanceo de carga.
Simplemente intentaría seguir descargando mediante una URL basada en el nombre de host.
Otros consejos
Una solución para solucionar el problema de VHost es usar su propio servidor DNS y devolver siempre la misma dirección IP para el host al que se está conectando.
Esto no requiere cambios en su aplicación.