SocketsServerPython#

import socket
import threading
import time

# creamos un socket TCP/IP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# especificamos la direccion y el puerto del servidor
server_address = ('localhost', 8070) # La dirección 0.0.0.0 se asigna para que todos los elementos de la red y de internet puedan ver y conectarse al server
print('Iniciando servidor en {} puerto {}'.format(*server_address))
sock.bind(server_address)

# definimos una función para el hilo de procesamiento de clientes
def procesar_cliente(conn, addr, semaforo, barrera):
    try:
        print('Conexión desde', addr)

        # enviamos un mensaje de bienvenida
        mensaje_bienvenida = 'Bienvenido al servidor! ¿Cómo puedo ayudarte?\n'
        conn.sendall(mensaje_bienvenida.encode('utf-8'))

        # esperamos a que el cliente envíe un mensaje
        while True:
            data = conn.recv(1024)
            if not data:
                break
            mensaje = data.decode('utf-8').strip()
            print('Mensaje recibido desde', addr, ':', mensaje)

            # enviamos una respuesta al cliente
            respuesta = 'Tu mensaje "{}" ha sido recibido. Gracias por contactarnos!\n'.format(mensaje)
            conn.sendall(respuesta.encode('utf-8'))

            # simulamos un procesamiento que toma tiempo
            time.sleep(1)

        # cerramos la conexión con el cliente
        conn.close()
        print('Conexión cerrada con', addr)

    finally:
        # liberamos el semáforo y esperamos a que todos los hilos terminen
        semaforo.release()
        barrera.wait()

# definimos el número máximo de clientes que podemos atender simultáneamente
max_clientes = 3

# creamos un semáforo con el número máximo de hilos permitidos
semaforo = threading.Semaphore(max_clientes)

# creamos una barrera para esperar a que todos los hilos terminen
barrera = threading.Barrier(max_clientes)

# iniciamos el servidor
sock.listen(1)
while True:
    # esperamos a que llegue una conexión
    print('Esperando una conexión...')
    conn, addr = sock.accept()

    # adquirimos el semáforo antes de procesar al cliente
    semaforo.acquire()

    # creamos un nuevo hilo para procesar al cliente
    cliente_thread = threading.Thread(target=procesar_cliente, args=(conn, addr, semaforo, barrera))
    cliente_thread.start()