SocketsServerJava#

System.out.println("Hola Mundo");

Sockets básicos en java#

Ejecutar cada una de las subsecciones (server, client) siguientes en dos notebooks diferentes

Server#

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {
    public static void main() {
        int puerto = 8080;

        try (ServerSocket serverSocket = new ServerSocket(puerto)) {
            System.out.println("Servidor escuchando en el puerto: " + puerto);

            while (true) {
                try (Socket socket = serverSocket.accept()) {
                    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    PrintWriter output = new PrintWriter(socket.getOutputStream(), true);

                    String mensaje = input.readLine();
                    System.out.println("Mensaje recibido del cliente: " + mensaje);

                    String respuesta = "Mensaje recibido: " + mensaje;
                    output.println(respuesta);
                }
            }
        } catch (Exception e) {
            System.out.println("Error en el servidor: " + e.getMessage());
        }
    }
}
Servidor.main();

Client#

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Cliente {
    public static void main() {
        String host = "localhost";
        int puerto = 8080;

        try (Socket socket = new Socket(host, puerto)) {
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);

            String mensaje = "Todo Bien?";
            output.println(mensaje);

            String respuesta = input.readLine();
            System.out.println("Respuesta del servidor: " + respuesta);
        } catch (Exception e) {
            System.out.println("Error en el cliente: " + e.getMessage());
        }
    }
}
Cliente.main();

Servidor Avanzado#

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class ServidorMultihilos {

    public static void main() {
        int puerto = 8070;
        int maxClientes = 3;
        ExecutorService executor = Executors.newFixedThreadPool(maxClientes);
        Semaphore semaforo = new Semaphore(maxClientes);

        try (ServerSocket serverSocket = new ServerSocket(puerto)) {
            System.out.println("Iniciando servidor en el puerto: " + puerto);

            while (true) {
                System.out.println("Esperando una conexión...");
                Socket socket = serverSocket.accept();

                semaforo.acquire();
                Runnable clientHandler = () -> {
                    procesarCliente(socket, semaforo);
                };
                executor.execute(clientHandler);
            }
        } catch (Exception e) {
            System.out.println("Error en el servidor: " + e.getMessage());
        }
    }

    public static void procesarCliente(Socket socket, Semaphore semaforo) {
        try {
            System.out.println("Conexión desde " + socket.getRemoteSocketAddress());

            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);

            String mensajeBienvenida = "Bienvenido al servidor! ¿Cómo puedo ayudarte?\n";
            output.println(mensajeBienvenida);

            String mensaje;
            while ((mensaje = input.readLine()) != null) {
                System.out.println("Mensaje recibido desde " + socket.getRemoteSocketAddress() + ": " + mensaje);

                String respuesta = "Tu mensaje \"" + mensaje + "\" ha sido recibido. Gracias por contactarnos!\n";
                output.println(respuesta);

                Thread.sleep(1000);
            }

            socket.close();
            System.out.println("Conexión cerrada con " + socket.getRemoteSocketAddress());

        } catch (Exception e) {
            System.out.println("Error en el procesamiento del cliente: " + e.getMessage());
        } finally {
            semaforo.release();
        }
    }
}
ServidorMultihilos.main();