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