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

  1. Socket: Un punto final para la comunicación entre dos máquinas.
  2. ServerSocket: Un socket que espera a que los clientes se conecten.
  3. Cliente: La máquina que inicia la comunicación.
  4. Servidor: La máquina que espera y responde a las solicitudes del cliente.

Tipos de Sockets

  1. Socket de flujo (Stream Socket): Utiliza el protocolo TCP para la comunicación.
  2. 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

  1. ServerSocket serverSocket = new ServerSocket(1234): Crea un ServerSocket que escucha en el puerto 1234.
  2. serverSocket.accept(): Espera a que un cliente se conecte. Este método es bloqueante.
  3. socket.getOutputStream(): Obtiene el flujo de salida del socket para enviar datos al cliente.
  4. PrintWriter writer = new PrintWriter(output, true): Crea un PrintWriter para enviar texto al cliente.
  5. writer.println("Bienvenido al servidor!"): Envía un mensaje de bienvenida al cliente.
  6. 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

  1. Socket socket = new Socket(hostname, port): Crea un Socket que se conecta al servidor en hostname y port.
  2. socket.getInputStream(): Obtiene el flujo de entrada del socket para recibir datos del servidor.
  3. BufferedReader reader = new BufferedReader(new InputStreamReader(input)): Crea un BufferedReader para leer texto del flujo de entrada.
  4. String message = reader.readLine(): Lee el mensaje enviado por el servidor.
  5. System.out.println("Mensaje del servidor: " + message): Imprime el mensaje recibido del servidor.
  6. 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

Módulo 2: Flujo de Control

Módulo 3: Programación Orientada a Objetos

Módulo 4: Programación Orientada a Objetos Avanzada

Módulo 5: Estructuras de Datos y Colecciones

Módulo 6: Manejo de Excepciones

Módulo 7: Entrada/Salida de Archivos

Módulo 8: Multihilo y Concurrencia

Módulo 9: Redes

Módulo 10: Temas Avanzados

Módulo 11: Frameworks y Librerías de Java

Módulo 12: Construcción de Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados