Pregunta

Entonces tiene una Cadena que se recupera de una interfaz de usuario web de administrador (por lo que definitivamente es una Cadena).¿Cómo puede saber si esta cadena es una dirección IP o un nombre de host en Java?

Actualizar:Creo que no lo dejé claro, más bien estaba preguntando si hay algo en el SDK de Java que pueda usar para distinguir entre IP y nombres de host.Perdón por la confusión y gracias a todos los que se tomaron/se tomarán el tiempo para responder esto.

¿Fue útil?

Solución

Puedes usar una expresión regular con este patrón:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Eso le dirá si es una dirección IPv4.

Otros consejos

¿Podemos suponer que es ¿uno u otro, y no algo completamente diferente?Si es así, probablemente usaría una expresión regular para ver si coincide con el formato "cuadrilátero con puntos".

Puede ver si la cadena coincide con el formato número.número.número.número, por ejemplo:

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

coincidirá con cualquier cosa de 0 - 999.

Cualquier otra cosa, puede tener el nombre de host predeterminado.

URI validator = new URI(yourString);

Ese código validará la dirección IP o el nombre de host.(Lanza una excepción de URI con formato incorrecto si la cadena no es válida)

Si estás tratando de distinguir los dos... entonces no leo tu pregunta.

¿No podrías simplemente hacer coincidir una expresión regular?

Puede utilizar un administrador de seguridad con el InetAddress.getByName(addr) llamar.

Si la dirección no es un quad punteado, getByName intentará realizar una conexión para realizar la búsqueda de nombres, que el administrador de seguridad puede capturar como un checkConnect(addr, -1) llamada, lo que genera una excepción de seguridad que puede detectar.

Puedes usar System.setSecurityManager() si está ejecutando todos los privilegios para insertar su administrador de seguridad personalizado antes del getByName se realiza la llamada.

No es tan simple como parece, existen algunas ambigüedades en torno a caracteres como guiones, guiones bajos y corchetes '-', '_', '[]'.

El SDK de Java tiene algunas limitaciones en esta área.Cuando se utiliza InetAddress.getByName, saldrá a la red para realizar una resolución de nombre DNS y resolver la dirección, lo cual es costoso e innecesario si lo único que desea es detectar el host frente a la dirección.Además, si una dirección está escrita en un formato ligeramente diferente pero válido (común en IPv6), no funcionará realizar una comparación de cadenas con los resultados de InetAddress.getByName.

La biblioteca Java de direcciones IP lo haré.El javadoc está disponible en el enlace.Descargo de responsabilidad:Soy el director del proyecto.

static void check(HostName host) {
    try {
        host.validate();
        if(host.isAddress()) {
            System.out.println("address: " + host.asAddress());
        } else {
            System.out.println("host name: " + host);
        }
    } catch(HostNameException e) {
        System.out.println(e.getMessage());
    }
}

public static void main(String[] args) {
    HostName host = new HostName("1.2.3.4");
    check(host);
    host = new HostName("1.2.a.4");
    check(host);
    host = new HostName("::1");
    check(host);
    host = new HostName("[::1]");
    check(host);
    host = new HostName("1.2.?.4");
    check(host);  
}

Producción:

address: 1.2.3.4
host name: 1.2.a.4
address: ::1
address: ::1
1.2.?.4 Host error: invalid character at index 4
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top