Objetivos del Módulo

En este módulo, aprenderás los conceptos básicos de redes en Java, cómo funcionan las conexiones de red y cómo puedes utilizar las clases de Java para crear aplicaciones que se comuniquen a través de una red. Al final de este módulo, deberías ser capaz de:

  • Comprender los conceptos básicos de redes.
  • Crear aplicaciones cliente-servidor utilizando sockets.
  • Utilizar las clases de Java para manejar conexiones de red.

Conceptos Básicos de Redes

Antes de sumergirnos en la programación de redes en Java, es importante entender algunos conceptos básicos de redes:

  1. Red: Un conjunto de computadoras conectadas entre sí para compartir recursos e información.
  2. Protocolo: Un conjunto de reglas que definen cómo se comunican las computadoras en una red. Ejemplos comunes incluyen TCP/IP, HTTP, FTP, etc.
  3. IP (Internet Protocol): Una dirección única asignada a cada dispositivo en una red.
  4. Puerto: Un número que identifica un proceso específico o servicio en una computadora.
  5. Socket: Un punto final para la comunicación entre dos máquinas.

Clases de Java para Redes

Java proporciona varias clases en el paquete java.net para facilitar la programación de redes. Algunas de las clases más importantes son:

  • InetAddress: Representa una dirección IP.
  • Socket: Permite la comunicación entre un cliente y un servidor.
  • ServerSocket: Espera a que los clientes se conecten y crea un Socket para cada conexión.
  • DatagramSocket: Utilizado para la comunicación sin conexión (UDP).
  • URL: Representa una URL y permite la comunicación a través de HTTP.

Ejemplo Práctico: Cliente-Servidor con Sockets

Servidor

El siguiente ejemplo muestra cómo crear un servidor simple que escucha en el puerto 1234 y envía un mensaje al cliente cuando se conecta.

import java.io.*;
import java.net.*;

public class SimpleServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(1234)) {
            System.out.println("Servidor escuchando en el puerto 1234...");
            while (true) {
                try (Socket clientSocket = serverSocket.accept();
                     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
                    System.out.println("Cliente conectado");
                    out.println("Hola desde el servidor!");
                } catch (IOException e) {
                    System.err.println("Error al manejar la conexión del cliente: " + e.getMessage());
                }
            }
        } catch (IOException e) {
            System.err.println("No se puede escuchar en el puerto 1234: " + e.getMessage());
        }
    }
}

Cliente

El siguiente ejemplo muestra cómo crear un cliente que se conecta al servidor en el puerto 1234 y recibe un mensaje.

import java.io.*;
import java.net.*;

public class SimpleClient {
    public static void main(String[] args) {
        String serverAddress = "127.0.0.1"; // Dirección IP del servidor
        int port = 1234; // Puerto del servidor

        try (Socket socket = new Socket(serverAddress, port);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String message = in.readLine();
            System.out.println("Mensaje del servidor: " + message);
        } catch (IOException e) {
            System.err.println("Error al conectar con el servidor: " + e.getMessage());
        }
    }
}

Ejercicio Práctico

Ejercicio 1: Crear un Servidor Echo

Crea un servidor que escuche en el puerto 5678 y devuelva cualquier mensaje que reciba del cliente.

Solución

import java.io.*;
import java.net.*;

public class EchoServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(5678)) {
            System.out.println("Servidor Echo escuchando en el puerto 5678...");
            while (true) {
                try (Socket clientSocket = serverSocket.accept();
                     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
                    System.out.println("Cliente conectado");
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        out.println("Echo: " + inputLine);
                    }
                } catch (IOException e) {
                    System.err.println("Error al manejar la conexión del cliente: " + e.getMessage());
                }
            }
        } catch (IOException e) {
            System.err.println("No se puede escuchar en el puerto 5678: " + e.getMessage());
        }
    }
}

Ejercicio 2: Crear un Cliente Echo

Crea un cliente que se conecte al servidor Echo en el puerto 5678 y envíe un mensaje, luego imprima la respuesta del servidor.

Solución

import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) {
        String serverAddress = "127.0.0.1"; // Dirección IP del servidor
        int port = 5678; // Puerto del servidor

        try (Socket socket = new Socket(serverAddress, port);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.println("Conectado al servidor Echo. Escribe un mensaje:");
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("Respuesta del servidor: " + in.readLine());
            }
        } catch (IOException e) {
            System.err.println("Error al conectar con el servidor: " + e.getMessage());
        }
    }
}

Resumen

En esta sección, hemos cubierto los conceptos básicos de redes y cómo utilizar las clases de Java para crear aplicaciones cliente-servidor. Hemos visto ejemplos prácticos de cómo crear un servidor y un cliente utilizando sockets. En los próximos temas, profundizaremos en otros aspectos de la programación de redes en Java, como ServerSocket, DatagramSocket, y URL.

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