Java Ejemplo - Programa de servidor multihilo implementado con Socket

Ejemplo de Java

En Java, se puede implementar un programa de servidor multihilo utilizandoServerSocketpara escuchar las conexiones de los clientes. Cada vez que hay una nueva conexión de cliente, se inicia un nuevo hilo para manejar esa conexión. A continuación se muestra un código de ejemplo que demuestra cómo usar Java Socket para implementar un programa de servidor multihilo.

Código del lado del servidor

Primero, creamos un programa del lado del servidor que escucha en un puerto especificado e inicia un nuevo hilo para cada conexión de cliente para manejar la comunicación.

Archivo MultiThreadedServer.java

import java.io.*; import java.net.*; public class MultiThreadedServer { public static void main(String[] args) { int port = 12345; //Definir el puerto del servidor try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("El servidor se ha iniciado, esperando conexiones de clientes..."); while (true) { Socket clientSocket = serverSocket.accept(); //Aceptar conexión de cliente System.out.println("Cliente conectado:" + clientSocket.getInetAddress().getHostAddress()); //Iniciar un nuevo hilo para cada conexión de cliente ClientHandler clientHandler = new ClientHandler(clientSocket); new Thread(clientHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ClientHandler implements Runnable { private Socket clientSocket; public ClientHandler(Socket socket) { this.clientSocket = socket; } @Override public void run() { try ( InputStream input = clientSocket.getInputStream(); OutputStream output = clientSocket.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); PrintWriter writer = new PrintWriter(output, true) ) { String clientMessage; while ((clientMessage = reader.readLine()) != null) { System.out.println("Mensaje recibido del cliente:" + clientMessage); writer.println("Respuesta del servidor:" + clientMessage); //Enviar mensaje de respuesta al cliente } } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

Código del cliente

El código del cliente se utiliza para conectarse al servidor y enviar mensajes. Se pueden crear múltiples clientes para probar la capacidad de procesamiento multihilo del servidor.

Código del archivo Client.java:

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        String serverAddress = "localhost";
        int port = 12345; // Puerto del servidor

        try (Socket socket = new Socket(serverAddress, port)) {
            System.out.println("Conectado al servidor");

            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));

            String userInput;
            while ((userInput = consoleReader.readLine()) != null) {
                writer.println(userInput);
                String serverResponse = reader.readLine();
                System.out.println("Respuesta del servidor: " + serverResponse);
            }
        } catch (UnknownHostException e) {
            System.err.println("Host desconocido: " + serverAddress);
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("No se pudo obtener la conexión de E/S a: " + serverAddress);
            e.printStackTrace();
        }
    }
}

Pasos para ejecutar

  1. Ejecutar el servidor:

    • Compilar y ejecutarMultiThreadedServerla clase.
    • El servidor se iniciará y escuchará las conexiones de clientes en el puerto especificado.
  2. Ejecutar el cliente:

    • Compilar y ejecutar variasClientinstancias de la clase para simular múltiples clientes conectándose al servidor.
    • En la consola del cliente, ingrese un mensaje; el cliente enviará el mensaje al servidor y el servidor responderá con el mismo mensaje.

Explicación

  • ServerSocket: El socket utilizado en el lado del servidor para escuchar las conexiones de los clientes.
  • Socket: El canal de comunicación entre el cliente y el servidor.
  • ClientHandler: La clase de hilo que maneja cada conexión de cliente.
  • BufferedReaderyPrintWriter: Se utiliza para leer y escribir flujos de datos.

Esta implementación asegura que el servidor pueda manejar múltiples conexiones de clientes simultáneamente, sin que las operaciones de larga duración de un cliente bloqueen las solicitudes de otros clientes.

Compilar el código

Abra una terminal o símbolo del sistema, cambie al directorio donde están guardados los archivos Java anteriores y compile el código:

javac MultiThreadedServer.java Client.java

Después de la compilación, ejecute primero el programa del servidor; el servidor se iniciará y comenzará a escuchar en el puerto 12345.

java MultiThreadedServer

Verá la salida del servidor:

El servidor se ha iniciado, esperando la conexión del cliente...

Abra otra ventana de terminal o símbolo del sistema y ejecute el programa del cliente. Puede ejecutar varias instancias del cliente para probar el procesamiento multihilo.

java Client

Verá la salida del cliente:

Conectado al servidor

Luego, puede ingresar un mensaje en la consola del cliente, por ejemplo:

Hello Server

El servidor responderá:

服务器回应: Hello Server

La salida del lado del servidor mostrará:

客户端已连接: 127.0.0.1
收到客户端消息: Hello Server

Ejemplo de Java

Otras extensiones