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:
- Red: Un conjunto de computadoras conectadas entre sí para compartir recursos e información.
- Protocolo: Un conjunto de reglas que definen cómo se comunican las computadoras en una red. Ejemplos comunes incluyen TCP/IP, HTTP, FTP, etc.
- IP (Internet Protocol): Una dirección única asignada a cada dispositivo en una red.
- Puerto: Un número que identifica un proceso específico o servicio en una computadora.
- 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
- 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