====== 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();
}
}
}