01 - 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”).

Servidor

  1. new ServerSocket(puerto) → queda “escuchando”.

  2. accept() (bloqueante) → devuelve un Socket por cliente.

  3. Lee/escribe por los streams de ese Socket.

  4. Cierra Socket (y luego ServerSocket si termina).

Cliente

  1. new Socket(host, puerto) → intenta conectarse.

  2. Escribe/lee datos.

  3. Cierra Socket.

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

  • clase/daw/si/1eval/sockets.txt
  • Última modificación: 2025/08/13 12:10
  • por cesguiro