serveur avec plusieurs clients Socket et select
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:
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:
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() |