package ar.com.javacuriosities.networking.tcp.threading; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /* * Cuando queremos manejar multiples clientes de forma concurrente debemos * podremos usar Threads * */ public class Step1ServerSocketTCP { public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(2); try { /* * Creamos un socket el cual va a estar esperando conexiones * Parámetros: Parámetro 1 --> Indica el puerto que vamos a estar * escuchando Parámetro 2 --> Indica el tamaño máximo de la queue de * conexiones Parámetro 3 --> Indica la dirección IP del server * * Otra opción es crear un socket unbound y luego asociarlo usando * el método bind() */ try (ServerSocket serverSocket = new ServerSocket(5000, 50, InetAddress.getLocalHost())) { /* * Este timeout se utiliza para definir el máximo de tiempo a * esperar en el método accept(), el 0 indica infinito, si el * timeout es alcanzado se arroja la exception * "java.net.SocketTimeoutException: Accept timed out" */ serverSocket.setSoTimeout(0); /* * El método accept() es bloqueante por lo cual genera un * bloqueo hasta que llega una conexión */ while (true) { // Aquí podremos utilizar un thread pool utilizando el concurrency package agregado en 1.5 o ir creando nuestros propios hilos threadPool.execute(new ClientHandler(serverSocket.accept())); // Thread thread = new Thread(new ClientHandler(serverSocket.accept())); // thread.start(); } } } catch (IOException e) { // Log and Handle exception e.printStackTrace(); } finally { threadPool.shutdown(); } } private static final class ClientHandler implements Runnable { private Socket clientSocket; public ClientHandler(Socket clientSocket) { super(); this.clientSocket = clientSocket; } @Override public void run() { try { // Pedimos el output stream para enviar mensajes al cliente OutputStream os = clientSocket.getOutputStream(); // Usamos un wrapper el cual nos permite escribir valores // primitivos de forma simple DataOutputStream dos = new DataOutputStream(os); // Write message dos.writeUTF("Hi!!!"); // Close output stream and client dos.close(); os.close(); clientSocket.close(); } catch (IOException e) { // Log and Handle exception e.printStackTrace(); } } } }