Vamos a verlo con enfoque de programación distribuida, que es justo el contexto de los documentos que me pasaste antes.


1. Qué es un socket en Java

Relacionado: IDOR. Forense de memoria de sistema completo. 2025 03 06 diseno y desarrollo de sistema. partes principales de un sistema robotico. 2025 02 13 TPM UEFI y sistemas Anticheat.

Un socket es un punto de comunicación que conecta dos procesos (pueden estar en la misma máquina o en máquinas distintas) a través de la red.
En Java, los sockets implementan el modelo de paso de mensajes que vimos en la teoría, pero usando APIs de entrada/salida de streams o paquetes datagrama.


2. Tipos principales

En Java tienes dos familias base:

TipoClase en JavaCaracterísticas
TCP (orientado a conexión)Socket (cliente) / ServerSocket (servidor)Fiable, ordenado, orientado a flujo de bytes, requiere establecer conexión.
UDP (no orientado a conexión)DatagramSocket, DatagramPacketNo fiable, sin control de orden, orientado a mensajes, más rápido.

3. Ciclo básico TCP

Servidor:

ServerSocket servidor = new ServerSocket(5000); // escucha en puerto 5000
Socket socket = servidor.accept(); // espera conexión (bloqueante)
InputStream entrada = socket.getInputStream();
OutputStream salida = socket.getOutputStream();
// trabajar con DataInputStream/DataOutputStream para datos tipados
socket.close();
servidor.close();

Cliente:

Socket socket = new Socket("localhost", 5000);
InputStream entrada = socket.getInputStream();
OutputStream salida = socket.getOutputStream();
socket.close();

Aquí:

  • El ServerSocket espera (accept()) hasta que llega un cliente.

  • El Socket representa la conexión punto a punto y da acceso a streams.


4. Ciclo básico UDP

Servidor:

DatagramSocket socket = new DatagramSocket(5000);
byte[] buffer = new byte[1024];
DatagramPacket paquete = new DatagramPacket(buffer, buffer.length);
socket.receive(paquete); // bloquea hasta recibir
String mensaje = new String(paquete.getData(), 0, paquete.getLength());

Cliente:

DatagramSocket socket = new DatagramSocket();
byte[] datos = "Hola".getBytes();
InetAddress destino = InetAddress.getByName("localhost");
DatagramPacket paquete = new DatagramPacket(datos, datos.length, destino, 5000);
socket.send(paquete);

5. Relación con la teoría

En el temario de Programación distribuida:

  • Un socket TCP sería un canal síncrono orientado a conexión: emisor y receptor deben estar conectados, y los mensajes (bytes) llegan en orden.

  • Un socket UDP sería un canal asíncrono orientado a datagramas: no garantiza orden ni entrega, pero el emisor no bloquea esperando confirmación.

  • Los datos que viajan por el socket pueden estar:

    • En formato binario puro (bytes, DataOutputStream/DataInputStream).

    • En texto (PrintWriter/BufferedReader).

    • Serializados (Java Object Serialization, JSON, Protobuf…).


6. Concurrencia en servidores con sockets

Un servidor concurrente en TCP usa normalmente un hilo por cliente o un pool:

while (true) {
    Socket cliente = servidor.accept();
    new Thread(() -> manejarCliente(cliente)).start();
}

O con ExecutorService:

ExecutorService pool = Executors.newFixedThreadPool(10);
while (true) {
    Socket cliente = servidor.accept();
    pool.execute(() -> manejarCliente(cliente));
}

Esto evita que un cliente lento bloquee a los demás.


7. Buenas prácticas

  • Cerrar siempre primero streams y luego sockets.

  • Manejar excepciones (IOException, SocketTimeoutException).

  • Evitar puertos reservados (<1024) para tus propios servicios.

  • Para comunicación entre distintos lenguajes/plataformas, acordar un protocolo y codificación (UTF-8, binario fijo, JSON, etc.).

  • Usar buffers para eficiencia (BufferedInputStream, BufferedOutputStream).


Si quieres, puedo prepararte un ejemplo completo de cliente-servidor TCP concurrente en Java que encaje con la teoría de los documentos que me pasaste. ¿Quieres que lo haga?