En este tema, aprenderemos sobre los sockets en Java, una herramienta fundamental para la comunicación en red. Los sockets permiten que dos nodos de una red se comuniquen entre sí. Un nodo puede ser cualquier dispositivo, como una computadora, un servidor o un dispositivo móvil.
Conceptos Clave
- Socket: Un punto final para la comunicación entre dos máquinas.
- ServerSocket: Un socket que espera a que los clientes se conecten.
- Cliente: La máquina que inicia la comunicación.
- Servidor: La máquina que espera y responde a las solicitudes del cliente.
Tipos de Sockets
- Socket de flujo (Stream Socket): Utiliza el protocolo TCP para la comunicación.
- Socket de datagrama (Datagram Socket): Utiliza el protocolo UDP para la comunicación.
Ejemplo Práctico: Comunicación Cliente-Servidor
Paso 1: Crear un Servidor
El servidor esperará a que un cliente se conecte y luego enviará un mensaje de bienvenida.
import java.io.*; import java.net.*; public class Servidor { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(1234)) { System.out.println("Servidor iniciado y esperando conexiones..."); Socket socket = serverSocket.accept(); System.out.println("Cliente conectado"); OutputStream output = socket.getOutputStream(); PrintWriter writer = new PrintWriter(output, true); writer.println("Bienvenido al servidor!"); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Explicación del Código del Servidor
- ServerSocket serverSocket = new ServerSocket(1234): Crea un
ServerSocket
que escucha en el puerto 1234. - serverSocket.accept(): Espera a que un cliente se conecte. Este método es bloqueante.
- socket.getOutputStream(): Obtiene el flujo de salida del socket para enviar datos al cliente.
- PrintWriter writer = new PrintWriter(output, true): Crea un
PrintWriter
para enviar texto al cliente. - writer.println("Bienvenido al servidor!"): Envía un mensaje de bienvenida al cliente.
- socket.close(): Cierra la conexión con el cliente.
Paso 2: Crear un Cliente
El cliente se conectará al servidor y recibirá el mensaje de bienvenida.
import java.io.*; import java.net.*; public class Cliente { public static void main(String[] args) { String hostname = "localhost"; int port = 1234; try (Socket socket = new Socket(hostname, port)) { InputStream input = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String message = reader.readLine(); System.out.println("Mensaje del servidor: " + message); socket.close(); } catch (UnknownHostException e) { System.out.println("Servidor no encontrado: " + e.getMessage()); } catch (IOException e) { System.out.println("Error de I/O: " + e.getMessage()); } } }
Explicación del Código del Cliente
- Socket socket = new Socket(hostname, port): Crea un
Socket
que se conecta al servidor enhostname
yport
. - socket.getInputStream(): Obtiene el flujo de entrada del socket para recibir datos del servidor.
- BufferedReader reader = new BufferedReader(new InputStreamReader(input)): Crea un
BufferedReader
para leer texto del flujo de entrada. - String message = reader.readLine(): Lee el mensaje enviado por el servidor.
- System.out.println("Mensaje del servidor: " + message): Imprime el mensaje recibido del servidor.
- socket.close(): Cierra la conexión con el servidor.
Ejercicio Práctico
Ejercicio 1: Modificar el Servidor para Enviar la Fecha y Hora Actual
Modifica el código del servidor para que, en lugar de enviar un mensaje de bienvenida, envíe la fecha y hora actual al cliente.
Solución
import java.io.*; import java.net.*; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Servidor { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(1234)) { System.out.println("Servidor iniciado y esperando conexiones..."); Socket socket = serverSocket.accept(); System.out.println("Cliente conectado"); OutputStream output = socket.getOutputStream(); PrintWriter writer = new PrintWriter(output, true); LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedNow = now.format(formatter); writer.println("Fecha y hora actual: " + formattedNow); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Resumen
En esta lección, hemos aprendido sobre los sockets en Java y cómo se utilizan para la comunicación en red. Hemos visto un ejemplo práctico de un servidor y un cliente que se comunican entre sí. Además, hemos realizado un ejercicio para reforzar los conceptos aprendidos. En la próxima lección, exploraremos el uso de ServerSocket
y Socket
en mayor profundidad, incluyendo la gestión de múltiples clientes.
Curso de Programación en Java
Módulo 1: Introducción a Java
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection