Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoyer a tous les clients - socket

    24 décembre 2016 à 16:14:23

    Salut !

    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 : 

    <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 12800), raddr=('127.0.0.1', 45290)>

    J'aimerai récuperer le laddr.

    Sinon je pense que c'est tout.


    Voici ce que j'obtiens lorsqu'un client envoie un message : 

      File "server_chat.py", line 59, in <module>
        clients_connectes.send(pickled_string)
    AttributeError: 'list' object has no attribute 'send'
    

    Est-ce que vous avez une idée ?

    Au fond, je pense que c'est tout simple mais je ne vois pas le petit détail...


    Merci !

    Joyeux Noel, au passage ;) !


    • Partager sur Facebook
    • Partager sur Twitter
    Y a rien de plus con qu’un ordinateur. Un + 1 si je vous ai aidé !
      25 décembre 2016 à 16:33:33

      Up !

      Je n'y arrive toujours pas !

      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 ? 

      • Partager sur Facebook
      • Partager sur Twitter
      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.
      • Editeur
      • Markdown