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 (ServerSocket), espera conexiones con el método (accept()), y habla con cada cliente a través de un 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(); } } }