Bonjour,

J'ai un serveur avec plusieurs clients que je traite avec le module select.

Je voudrais que à chaque fois qu'un client envoie une information, le serveur récupère l'information (ce qui marche avec mon serveur ) et renvoie un message a tous les clients (c'est moins bien ).
J'essaye d'utiliser select mais le resultat n'est pas celui escompté !, je voudrais transmettre un message unique a tous les clients connectes à chaque envoi d'information par un client.

Je ne comprends pas trop mon erreur et comment bien utiliser select.
Merci de votre aide



le code de mon serveur est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#! /usr/bin/env python
# -*- coding:Utf8 -*-
 
 
 
import socket
import select
 
hote = ''
port = 12800
 
connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connexion_principale.bind((hote, port))
connexion_principale.listen(5)
print("Le serveur écoute à présent sur le port {}".format(port))
 
serveur_lance = True
clients_connectes = []
while serveur_lance:
    # On va vérifier que de nouveaux clients ne demandent pas à se connecter
    # Pour cela, on écoute la connexion_principale en lecture
    # On attend maximum 50ms
    connexions_demandees, wlist, xlist = select.select([connexion_principale],
        [], [], 0.05)
 
    for connexion in connexions_demandees:
        connexion_avec_client, infos_connexion = connexion.accept()
        # On ajoute le socket connecté à la liste des clients
        clients_connectes.append(connexion_avec_client)
 
    # Maintenant, on écoute la liste des clients connectés
    # Les clients renvoyés par select sont ceux devant être lus (recv)
    # On attend là encore 50ms maximum
    # On enferme l'appel à select.select dans un bloc try
    # En effet, si la liste de clients connectés est vide, une exception
    # Peut être levée
    clients_a_lire = []
    clients_a_informer = []
 
    try:
        clients_a_lire, clients_a_informer, xlist = select.select(clients_connectes,clients_connectes, [], 0.01)
    except select.error:
        pass
    else:
        # On parcourt la liste des clients à lire
        for client in clients_a_lire:
            client.send(b"Bien recu")
            # Client est de type socket
            msg_recu = client.recv(1024)
            # Peut planter si le message contient des caractères spéciaux
            msg_recu = msg_recu.decode()
            print("Reçu {}".format(msg_recu))
 
 
            if msg_recu == "fin":
                serveur_lance = False
 
        for client in clients_a_informer: 
            message="bonjour a tous  \n"
            message=message.encode("Utf8")
            client.send(message)
 
 
 
 
print("Fermeture des connexions")
for client in clients_connectes:
    client.close()
 
connexion_principale.close()
le code du client basique que j'utilise est

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#! /usr/bin/env python
# -*- coding:Utf8 -*-
 
 
import socket
 
hote = "localhost"
port = 12800
 
connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connexion_avec_serveur.connect((hote, port))
print("Connexion établie avec le serveur sur le port {}".format(port))
 
msg_a_envoyer = b""
while msg_a_envoyer != b"fin":
    msg_a_envoyer = input("> ")
 
    msg_a_envoyer = msg_a_envoyer.encode("Utf8")
 
    connexion_avec_serveur.send(msg_a_envoyer)
    msg_recu = connexion_avec_serveur.recv(1024)
    print(msg_recu.decode("Utf8")) 
 
 
print("Fermeture de la connexion")
connexion_avec_serveur.close()