Boucle while True bloquée

bob12345 -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

je débute en python et je rencontre un problème que je n'arrive pas à résoudre. Voici mon code:

 
with open(os.path.join(save_path, filename), "wb") as file_to_write:
    while True:
        dat = conn.recv(1024)
        if not dat:
            break
        file_to_write.write(dat)
    file_to_write.close()


J'utilise socket pour recevoir des données et les écrire dans un fichier, tout se passe bien et je les reçois, mais dès que mon autre programme arrête d'envoyer, ma boucle semble ne pas s'arrêter et je n'ai aucun message d'erreur, juste du "vide" dans le terminal où je ne peux pas écrire. J'ai essayé plein d'autres alternatives pour le "if...break" mais ça ne marchait toujours pas. Je tiens à préciser que l'autre programme n'a aucun problème et qu'il fonctionne comme je le souhaite.

Est-ce que j'ai fait une erreur de logique ou plutôt syntaxique?

Merci d'avance pour vos réponses.
A voir également:

2 réponses

jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
Bonjour,

Je ne connais pas ces process sous python. Mais il semble logique que ton programme attende de recevoir quelque chose. Pour y mettre fin, soit il faudrait un timeout sur réception, soit que l’émetteur envoie un message de fin de communication.
0
bob12345
 
Bonjour,
Je vais essayer de mettre en place le timeout quand j'en aurais la possibilité et vous tiendrais au courant.
Merci de votre réponse.
0
bob12345
 
Ca n'a malheureusement pas marché, je pense que je vais revoir entièrement mon code et le refaire.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > bob12345
 
qu'as-tu essayé?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
L'émetteur pourrait aussi se terminer, ce qui fermerait le socket.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
as-tu ajouté des print() afin de déterminer à quel endroit le programme était "bloqué"?
0
bob12345
 
Oui j'ai essayé, il se bloque après la dernière ligne de la boucle. J'ai mis une autre condition pour voir si ça se débloque. L'émetteur envoi "stop' et la boucle est sensée s'arrêter si elle le reçoit. Mais même avec ça, elle reste bloquée. L'émetteur ne termine pas la connection, il fonctionne comme prévu: il envoie les données, puis envoie le stop et il lance une autre fonction.
0
bob12345
 
EDIT: Je viens d'essayer un autre solution, elle ne marche pas, mais elle me donne certaines réponse:

with open(os.path.join(save_path, filename), "wb") as file_to_write:

        sizee = int("".join(map(chr, conn.recv(1024)))) #nombre de bytes à recevoir
        reciby = 0 #bytes reçus
        while reciby < sizee:
            dat = conn.recv(1024)
            file_to_write.write(dat)
            print("1") #Un print pour voir le comportement de la boucle
            reciby = reciby+1
        
            
    file_to_write.close()



Ce bout de code me donne une erreur car "8textstop" n'est pas un nombre. 8 est le nombre de bytes, text est le contenu du fichier txt que je veux envoyer et stop est le "stop". A ce stade je ne comprends plus rien, Je vais aussi mettre le code de l'émetteur pour que vous puissiez voir:


#émetteur
reqFile = s.recv(1024)
    reqfile = "".join(map(chr, reqFile))
    size = os.path.getsize(reqfile)
    sized = str(size)
    s.send(sized.encode())
    with open(reqfile, "rb") as file_to_send:
        for data in file_to_send:
            s.send(data) #J'utilisais s.sendall ici
    s.send("stop".encode())
            
   

    print("sent")



EDIT 2: Peut être que l'émetteur envoie tous les messages car j'utilisais "s.sendall" au lieu de "send".
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > bob12345
 
Il me semble que ton message est foireux.
Au lieu de
8textstop
, j'enverrais
4.text
.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > bob12345
 
je pense que tu n'as pas mis assez de print().
dans quelle instruction se bloque-t-il?
0
bob12345 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
En fait le problème c'est que il n'est pas censé envoyer "8textstop ". Il doit envoyer 8 puis texte et stop. Mais bon de toute façon je vais le refaire entièrement si j'en ai le temps, ça m'a prit 2 jours et je ne peux pas me permettre de consacrer plus de temps à le faire. En tout cas, je vous remercie pour vos réponses.
0