J'ai suivis le cours d'openclassrooms sur le python et au chapitre du reseau, je bloque !
J'aimerai faire un petit chat, et donc forcement lorsque quelqu'un envoie un message, tout le monde doit le recevoir ( sauf l'envoyeur ).
Or, je n'arrive même pas a trouver le moyen qui est comment envoyer à tous les gens ...
Voici serveur.py
import socket
import select
import time
import json
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))
# Fichier de sauvegarde chat
fichier = open("data_chat.txt", "a")
serveur_lance = True
clients_connectes = []
tous_les_clients= []
while serveur_lance:
message=[]
# 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)
print(clients_connectes)
# 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 = []
try:
clients_a_lire, wlist, xlist = select.select(clients_connectes,
[], [], 0.05)
except select.error:
pass
else:
# On parcourt la liste des clients à lire
for client in clients_a_lire:
# Client est de type socket
msg_recu = client.recv(2048)
# Peut planter si le message contient des caractères spéciaux
msg_recu = msg_recu.decode()
message_tmp=str(time.time())+' -- '+str(client)+' : '+str(msg_recu)
fichier.write(message_tmp)
message.append(message_tmp)
pickled_string = json.dumps(message)
pickled_string = pickled_string.encode()
clients_connectes.send(pickled_string)
print("Fermeture des connexions")
for client in clients_connectes:
client.close()
connexion_principale.close()
fichier.close()
J'ai bien vu que que la variable : clients_connectes comprenait les clients connectés mais comment s'en servir afin de l'utiliser avec send ?
Par ailleurs, j'ai essayé de récupérer l'adresse IP de l'utilisateur dans la var message_tmp mais j'ai un gros :
En gros avec la liste des utilisateurs connectés, j'aimerai pouvoir leur envoyer le message qu'un utilisateur aurait envoyé, sauf lui même.
Donc utilser .send avec la variable clients_connectes
Est-ce que possible ?
Y a rien de plus con qu’un ordinateur. Un + 1 si je vous ai aidé !
Envoyer a tous les clients - socket
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.