====== 01 - Sockets ====== ===== Sockets ===== Un socket es un “enchufe” de software que permite a dos programas comunicarse por red. En Java (vía TCP): * **Servidor**: Usa la clase ([[https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/ServerSocket.html|ServerSocket]]), espera conexiones con el método ([[https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/ServerSocket.html#accept()|accept()]]), y habla con cada cliente a través de un [[https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/Socket.html|Socket]].\\ \\ * **Cliente**: se conecta a host:puerto y envía/recibe datos.\\ \\ TCP garantiza entrega y orden de los bytes; tú decides el protocolo de mensajes (por ejemplo, “una línea por mensaje”). ===== Ciclo de vida clásico ===== **Servidor** - **new ServerSocket(puerto)** → queda “escuchando”.\\ \\ - **accept() (bloqueante)** → devuelve un Socket por cliente.\\ \\ - Lee/escribe por los streams de ese Socket.\\ \\ - Cierra Socket (y luego ServerSocket si termina).\\ \\ **Cliente** - **new Socket(host, puerto)** → intenta conectarse.\\ \\ - Escribe/lee datos.\\ \\ - Cierra Socket.\\ \\ ===== Ejemplo ===== **Servidor** package es.cesguiro.socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { private final int port = 12345; public Server() { } public void start() { System.out.println("Starting server on port " + port + "..."); try { ServerSocket serverSocket = new ServerSocket(port); System.out.println("Server started. Waiting for client connections..."); Socket socket = serverSocket.accept(); System.out.println("Client connected: " + socket.getInetAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String message = in.readLine(); System.out.println("Received message: " + message); socket.close(); serverSocket.close(); } catch (Exception e) { System.out.println("Error starting server: " + e.getMessage()); throw new RuntimeException("Failed to start server", e); } } } package es.cesguiro.socket; public class Main { public static void main(String[] args) { Server server = new Server(); server.start(); } } **Cliente** package es.cesguiro.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.Socket; public class Client { private final String host = "localhost"; private final int port = 12345; public void connect() throws IOException { System.out.println("Connecting to server at " + host + ":" + port + "..."); Socket socket = new Socket(host, port); System.out.println("Connected to server: " + socket.getInetAddress()); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello from client!"); System.out.println("Message sent to server."); out.close(); } } package es.cesguiro.socket; import java.io.IOException; public class Main { public static void main(String[] args) { Client client = new Client(); try { client.connect(); } catch (IOException e) { System.err.println("Error connecting to server: " + e.getMessage()); e.printStackTrace(); } } }