24/04/2014
El paquete java.net en Java es fundamental para desarrollar aplicaciones de red. Proporciona las clases necesarias para implementar funcionalidades de red, desde la creación de sockets hasta el manejo de protocolos como HTTP. Este paquete se puede dividir en dos partes principales: una API de bajo nivel y una API de alto nivel.
API de Bajo Nivel: El cimiento de la conectividad
La API de bajo nivel de java.net se centra en abstracciones fundamentales para la comunicación de red:
- Direcciones (Addresses): Representan identificadores de red, como direcciones IP. La clase InetAddress es la principal, con subclases Inet4Address (IPv4) e Inet6Address (IPv6). Aunque existen subclases, InetAddress suele ser suficiente para la mayoría de las necesidades.
- Sockets: Mecanismos básicos de comunicación bidireccional. java.net ofrece varios tipos:
- Socket: API cliente TCP para conectarse a un host remoto.
- ServerSocket: API servidor TCP para aceptar conexiones de sockets cliente.
- DatagramSocket: API punto final UDP para enviar y recibir paquetes de datagramas.
- MulticastSocket: Subclase de DatagramSocket para grupos de multidifusión.
La comunicación con sockets TCP se realiza mediante InputStreams y OutputStreams , obtenidos con Socket.getInputStream() y Socket.getOutputStream() .
- Interfaces (Interfaces): La clase NetworkInterface permite explorar y consultar las interfaces de red de la máquina local (Ethernet, PPP, etc.). Se utiliza para verificar la compatibilidad con IPv6, entre otras cosas. Es importante notar que, como mínimo, debe existir una interfaz, ya sea conectada a una red o una interfaz de bucle (loopback).
IPv6 y Consideraciones
La compatibilidad con IPv6 varía. Aunque Java intenta detectarlo y utilizarlo automáticamente, se puede desactivar mediante una propiedad del sistema. Si IPv6 no está disponible o está deshabilitado, Inet6Address deja de ser válido para la mayoría de las operaciones. Mientras que métodos como InetAddress.getByName(java.lang.String) no devolverán un Inet6Address al buscar nombres de host, es posible crear un objeto Inet6Address mediante literales, en cuyo caso, la mayoría de los métodos lanzarán una excepción.

API de Alto Nivel: Abstracción y Facilidad de Uso
La API de alto nivel de java.net simplifica el acceso a recursos en la red:
- URI (URI): Representa un Identificador de Recurso Universal (RFC 2396). Sirve para identificar recursos, pero no proporciona acceso directo a ellos.
- URL (URL): Representa un Localizador de Recurso Universal. Es un concepto más antiguo que URI y permite acceder a los recursos.
- URLConnection: Se crea a partir de una URL y es el enlace de comunicación para acceder al recurso. Delega la mayor parte del trabajo a los manejadores de protocolos subyacentes (http, https, etc.).
- HttpURLConnection: Subclase de URLConnection con funcionalidades específicas para HTTP. Ha sido reemplazada por la API de cliente HTTP más moderna.
La mejor práctica es usar URI para identificar recursos y luego convertirlo a URL para acceder a él. Desde la URL, se puede obtener URLConnection para un control más preciso o InputStream directamente.
Ejemplo:
URI uri = new URI("http://www.example.com/");
URL url = uri.toURL();
InputStream in = url.openStream();
Manejadores de Protocolo: Extendiendo las capacidades de java.net
URL y URLConnection dependen de manejadores de protocolo. Si un manejador no existe, se lanza una excepción. Esta es la principal diferencia con URI, que solo identifica recursos y no necesita acceder a los manejadores de protocolo. Se pueden implementar manejadores de protocolo adicionales como servicios. Los proveedores de servicios de tipo URLStreamHandlerProvider se localizan en tiempo de ejecución, como se especifica en el constructor URL.
Ejemplo de URL con un esquema de protocolo personalizado:
myproto://myhost.mydomain/resource/
Por defecto, los manejadores de protocolo se cargan dinámicamente desde la ubicación predeterminada.
Consultas Habituales sobre Java.net
¿Cómo crear un socket cliente en Java?
Para crear un socket cliente TCP, se utiliza la clase Socket. Se necesita especificar la dirección IP y el puerto del servidor.
Socket socket = new Socket("localhost", 8080);
¿Cómo crear un socket servidor en Java?
Para crear un socket servidor TCP, se usa la clase ServerSocket. Se especifica el puerto de escucha.
ServerSocket serverSocket = new ServerSocket(8080);
¿Cómo manejar excepciones de red en Java?
Las excepciones de red se manejan con bloques try-catch, capturando excepciones como IOException, UnknownHostException, SocketException, etc.
try {
// Código de red
} catch (IOException e) {
// Manejo de la excepción
}
¿Qué es un URLConnection y para qué sirve?
URLConnection es una clase abstracta que representa la conexión a un recurso especificado por una URL. Permite realizar diversas operaciones, como enviar solicitudes HTTP y recibir respuestas.
¿Cuál es la diferencia entre URI y URL?
URI identifica un recurso, mientras que URL identifica un recurso y proporciona un medio para acceder a él.
Tabla Comparativa de Clases Clave de java.net
| Clase | Descripción | Tipo de API |
|---|---|---|
| InetAddress | Representa una dirección IP | Bajo Nivel |
| Socket | Socket cliente TCP | Bajo Nivel |
| ServerSocket | Socket servidor TCP | Bajo Nivel |
| DatagramSocket | Socket UDP | Bajo Nivel |
| URI | Identificador de Recurso Universal | Alto Nivel |
| URL | Localizador de Recurso Universal | Alto Nivel |
| URLConnection | Conexión a un recurso | Alto Nivel |
El paquete java.net es una herramienta esencial para cualquier desarrollador Java que trabaje con aplicaciones de red. Su comprensión es fundamental para crear aplicaciones robustas y eficientes que interactúen con el entorno exterior.
Si quieres conocer otros artículos parecidos a Java.net del paquete de red de java puedes visitar la categoría Libros y Librerías.
