• # TCP

    Posté par . En réponse au message client serveur par socket en clientThread. Évalué à 3.

    Bonjour,

    Le code que tu utilises ne marche pas pour une raison très simple : quand on fait de la communication réseau au niveau applicatif (comme toi), on utilise généralement une couche transport qui est UDP ou TCP. Tu as utilisé TCP (en précisant que la socket est de type SOCK_STREAM), et c'est une bonne chose pour ce genre d'utilisation, seulement, il faut comprendre comment TCP fonctionne.

    Quand tu demandes à TCP d'envoyer un message, il le découpe en plein de morceaux, chaque message est alors envoyé via IP (généralement), qui lui même va le filer à une couche lien, qui elle même va faire transiter le paquet sur un bon vieux câble (ou du wifi). Lors de la réception, l'inverse est effectué, en écoutant le câble, la couche lien va faire remonter le paquet IP, qui lui même revient à la couche TCP.

    Comme tu as pu le remarquer, d'un côté il y a un découpage implicite, de l'autre il n'y a pas de reconstruction, c'est une des particularités de TCP : il produit uniquement des flux. En conclusion :

    1. C'est à toi de délimiter la fin d'un message
    2. C'est à toi d'accumuler les bouts de message à la réception jusqu'à obtention d'un message complet

    Dans ton cas, TCP est particulièrement adapté car dès que tu lis un paquet, tu peux écrire directement ce morceau dans le fichier, et faire du streaming, plutôt que d'attendre d'avoir l'intégralité du fichier en mémoire avant de l'écrire. Note par exemple que le paramètre que tu donnes à recv est la taille maximale d'un message que tu veux lire ... donc sauf si ton fichier fait moins de 1024 octets il te faudra nécessairement plusieurs recv pour récupérer ton fichier en entier.

    socket_client = ...
    while 1:
     message = socket_client.recv (1024)
     contenu,doit_terminer = fonction_qui_determine_si_on_est_a_la_fin (message)
     file.write (contenu)
     if doit_terminer:
     break

    J'espère que j'ai été assez clair et que tu peux maintenant continuer ton programme :-)