Arquitectura TCP en Java
Es vital entender la comunicación TCP cuando estamos trabajando con Java. La relación cliente/servidor en una arquitectura TCP permite la transferencia de datos de manera confiable.
Creación de un cliente TCP en Java
Primero, vamos a detallar como construir el lado del cliente. Necesitaremos de las clases Socket y DataOutputStream del paquete java.net y java.io respectivamente.
import java.net.*; import java.io.*; public class Cliente { public static void main(String[] args) { Socket cliente; DataOutputStream flujo_salida; try { cliente = new Socket("localhost", 5000); flujo_salida = new DataOutputStream(cliente.getOutputStream()); flujo_salida.writeUTF("Mensaje desde el cliente"); cliente.close(); } catch(Exception e) { System.out.println(e.getMessage()); } } }
Creación de un Servidor TCP en Java
Luego, creamos el lado del servidor. Utilizaremos las clases ServerSocket y DataInputStream.
import java.net.*; import java.io.*; public class Servidor { public static void main(String[] args) { ServerSocket servidor; Socket conexionCliente; DataInputStream flujo_entrada; try { servidor = new ServerSocket(5000); System.out.println("Esperando conexión..."); conexionCliente = servidor.accept(); flujo_entrada = new DataInputStream(conexionCliente.getInputStream()); System.out.println("Mensaje del cliente: " + flujo_entrada.readUTF()); conexionCliente.close(); } catch(Exception e) { System.out.println(e.getMessage()); } } }
Manejo de excepciones
Es esencial destacar que el manejo de excepciones es crucial en este tipo de aplicaciones, especialmente cuando tratamos con conexiones de red que pueden caer.
Gestión de múltiples clientes
¿Qué sucede cuando nuestra aplicación necesita manejar múltiples clientes simultáneamente? En este caso, podemos hacer uso de hilos para manejar cada conexión de cliente de manera independiente.
import java.net.*; import java.io.*; public class ServidorMultiCliente { public static void main(String[] args) { ServerSocket servidor; Socket conexionCliente; DataInputStream flujo_entrada; try { servidor = new ServerSocket(5000); System.out.println("Esperando conexión..."); while(true) { conexionCliente = servidor.accept(); Thread t = new ClienteHandler(conexionCliente); t.start(); } } catch(Exception e) { System.out.println(e.getMessage()); } } } class ClienteHandler extends Thread { private Socket conexionCliente; private DataInputStream flujo_entrada; public ClienteHandler(Socket conexionCliente) { this.conexionCliente = conexionCliente; } @Override public void run() { try { flujo_entrada = new DataInputStream(conexionCliente.getInputStream()); System.out.println("Mensaje del cliente: " + flujo_entrada.readUTF()); conexionCliente.close(); } catch(Exception e) { System.out.println(e.getMessage()); } } }
Reflexiones
No olvidemos que el objetivo último de cualquier programa multi-socket es fomentar la comunicación entre aplicaciones. Con suerte, este tutorial ha aclarado algunos de los matices de la creación de estas aplicaciones en Java.