fait en sorte que le code suivant (serveur) puisse lance un quizz sur tout les clients en même temps si on écrit "start" dans la console :
import threading
import time
import random
import socket
import sys

HOST = 'localhost'
PORT = 40000

dictClients = {}
classement = {}
couleurs = ["\x1b[36;1m", "\x1b[32;1m", "\x1b[33;1m", "\x1b[34;1m", "\x1b[35;1m", "\x1b[36;1m",
            "\x1b[31;1m", "\x1b[32;1m", "\x1b[33;1m", "\x1b[34;1m", "\x1b[35;1m", "\x1b[36;1m",
            "\x1b[31;1m", "\x1b[32;1m", "\x1b[33;1m", "\x1b[34;1m", "\x1b[35;1m", "\x1b[36;1m",
            "\x1b[31;1m", "\x1b[32;1m"]
couleurs_clients = {}
reset = "\x1b[0m"
list_question = [
    (
        "Le premier ordinateur a été inventé en :\n1) 1822\n2) 1843\n3) 1946\n4) 1956\n0) Je ne sais pas",
        '3'
    ),
    (
        "Le premier virus informatique a été créé en :\n1) 1971\n2) 1975\n3) 1981\n4) 1983\n0) Je ne sais pas",
        '1'
    ),
    (
        "Le premier navigateur web a été créé en :\n1) 1989\n2) 1990\n3) 1991\n4) 1992\n0) Je ne sais pas",
        '1'
    ),
    (
        "La première plateforme de médias sociaux a été créée en :\n1) 1997\n2) 1998\n3) 1999\n4) 2000\n0) Je ne sais pas",
        '2'
    ),
    (
        "Le premier smartphone a été créé en :\n1) 2002\n2) 2003\n3) 2004\n4) 2005\n0) Je ne sais pas",
        '2'
    )
]
quiz_in_progress = threading.Event()

class ThreadClient(threading.Thread):
    '''dérivation d'un objet thread pour gérer la connexion avec un client'''

    def __init__(self, conn):
        threading.Thread.__init__(self)
        self.connexion = conn
        self.client_name = None

    def send_message(self, message):
        """Envoyer un message au client"""
        self.connexion.sendall(bytes(message, 'UTF-8'))

    def broadcast_message(self, message):
        """Envoyer un message à tous les clients, sauf l'émetteur"""
        for client_name, client_thread in dictClients.items():
            if client_name != self.client_name:
                client_thread.send_message(message)

    def questionnaire(self):
        classement[self.client_name] = {'points': 0, 'temps': []}
        for i in range(len(list_question)):
            self.send_message(list_question[i][0])
            temps = time.time()
            while True:
                current_time = time.time()
                temp_ecouler = current_time - temps
                if temp_ecouler >= 10:
                    break
                elif self.connexion.recv(1024).decode(encoding='UTF8').strip() == list_question[i][1]:
                    classement[self.client_name]['points'] += 1
                    classement[self.client_name]['temps'].append(temp_ecouler)
                    break
                else:
                    break

    def run(self):
        # Demande le pseudo du client
        self.connexion.sendall(bytes("Entrez votre pseudo :", 'UTF-8'))
        self.client_name = self.connexion.recv(1024).decode(encoding='UTF-8')

        # Vérification si le pseudo est déjà utilisé
        while self.client_name in dictClients:
            self.connexion.sendall(bytes("Pseudo déjà utilisé. Veuillez en choisir un autre :", 'UTF-8'))
            self.client_name = self.connexion.recv(1024).decode(encoding='UTF-8')

        # Ajoute le client à la liste des clients connectés
        dictClients[self.client_name] = self

        # Attribution d'une couleur au client
        couleurs_clients[self.client_name] = random.choice(couleurs)

        # Accueille le client
        self.send_message(
            f"{couleurs_clients[self.client_name]}Bonjour {self.client_name} ! Bienvenue dans le chat. Tapez 'fin' pour quitter.{reset}"
        )
        self.broadcast_message(f"{couleurs_clients[self.client_name]}{self.client_name}{reset} a rejoint le chat !")
        print(f"{couleurs_clients[self.client_name]}{self.client_name}{reset} a rejoint le chat !")

        # Attente des messages du client
        while True:
            try:
                message = self.connexion.recv(1024).decode(encoding='UTF-8')
                if message.lower() == "fin":
                    break
                elif message.lower() == "start":
                    if not quiz_in_progress.is_set():
                        thread_question.start_quiz()  # Démarrer le quiz pour tous les clients
                    else:
                        self.send_message("Un quiz est déjà en cours.")
                else:
                    self.broadcast_message(f"{couleurs_clients[self.client_name]}{self.client_name}{reset} : {message}")
                    print(f"{couleurs_clients[self.client_name]}{self.client_name}{reset} : {message}")
            except:
                break

        # Supprime le client de la liste des clients connectés
        self.broadcast_message(f"{couleurs_clients[self.client_name]}{self.client_name}{reset} a quitté le chat.")
        print(f"{couleurs_clients[self.client_name]}{self.client_name}{reset} a quitté le chat.")
        del dictClients[self.client_name]
        del couleurs_clients[self.client_name]
        self.connexion.close()

class ThreadQuestion(threading.Thread):
    '''dérivation d'un objet thread pour gérer la connexion avec un client'''

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global quiz_in_progress

        while True:
            quiz_in_progress.wait()  # Attend le signal de démarrage du quiz

            # Pose les questions aux clients
            for client_name, client_thread in dictClients.items():
                client_thread.send_message("Le quiz va commencer. Préparez-vous !")
                time.sleep(2)

            time.sleep(5)  # Attend quelques secondes avant de lancer les questions

            for client_name, client_thread in dictClients.items():
                client_thread.send_message("Les questions vont maintenant être posées.")

            time.sleep(2)

            # Lance le questionnaire pour tous les clients
            for client_name, client_thread in dictClients.items():
                client_thread.questionnaire()

            quiz_in_progress.clear()  # Réinitialise le signal de démarrage du quiz

# Programme principal
if __name__ == '__main__':
    # Initialisation du serveur
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        mySocket.bind((HOST, PORT))
    except socket.error:
        print("La liaison du socket à l'adresse choisie a échoué.")
        sys.exit()

    print("Serveur prêt, en attente de requêtes ...")
    mySocket.listen(5)

 # Crée un thread pour le questionnaire
    thread_question = ThreadQuestion()
    thread_question.start()

    # Attente des connexions des clients
    while True:
        connexion, adresse = mySocket.accept()
        th = ThreadClient(connexion)
        th.start()