[Python 3] Transfert de fichier par socket

Signaler
Messages postés
1
Date d'inscription
dimanche 17 octobre 2021
Statut
Membre
Dernière intervention
17 octobre 2021
-
Salut, j'ai trouvé un programme python très sympa qui permet de transférer des fichiers avec le module Socket, il fait à la fois serveur et client : https://codes-sources.commentcamarche.net/source/53419-transfert-de-fichier-par-socket

Le seul problème est qu'il est très vieux et qu'il ne marche pas en python 3, je l'ai donc adapté pour qu'il puisse marcher en python 3. voici le code :

##################################################################
# PySTFS : Systeme de transfert de fichier par socket en Python
# Version 0.1
# Developpeur : Moreau Guillaume
# Contact : XXXXXXXXXXXXXXXXXXXXXX
# Revision par :
##################################################################

import time, socket, os, math
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("")
print(" ##################################################################")
print(" # PySTFS : Systeme de transfert de fichier par socket en Python")
print(" # Developpeur : Moreau Guillaume ")
print(" # Contact : XXXXXXXXXXXXXXX")
print(" ##################################################################")
print("")

nomFich = input(" >> Nom du fichier a envoyer (ou rien pour recevoir) : ")

##################################################################
# PARTIE ENVOIE DU FICHIER
##################################################################
if nomFich != "":
    try:
        fich = open(nomFich, "rb") # test si le fichier existe
        fich.close()
    except:
        print(" >> le fichier '" + nomFich + "' est introuvable.")
        time.sleep(2)
        exit()

    octets = os.path.getsize(nomFich) / 1024
    print(" >> OK : '" + nomFich + "' [" + str(octets) + " Ko]")
    print("")

    # Connexion au serveur
    ############################################
    host = input(" >> Adresse IP du serveur : ")
    print(" >> Connexion en cours avec " + host + "...")
    try:
        socket.connect((host, 2110)) # test si le serveur existe
    except:
        print(" >> le serveur '" + host + "' est introuvable.")
        time.sleep(2)
        exit()
        
    
    print("")
    print(" >> Vous etes connecte au serveur, patientez d'une reponse...")
    print("")
    socket.send(("NAME " + nomFich + "OCTETS " + str(octets)).encode("utf8")) # Envoi du nom et de la taille du fichier  

    # Boucle temps que l'ont est connecte
    ############################################
    while (socket.connect):

        recu = socket.recv(1024)
        if not recu : break

        if recu == "GO".encode("utf8"): # Si le serveur accepte on envoi le fichier
            print(" >> Le serveur accepte le transfert")
            print(time.strftime(" >> [%H:%M] transfert en cours veuillez patienter..."))
            print(" ")

            num = 0
            pourcent = 0
            octets = octets * 1024 # Reconverti en octets
            fich = open(nomFich, "rb")

            if octets > 1024:   # Si le fichier est plus lourd que 1024 on l'envoi par paquet
                for i in range(math.ceil(octets / 1024)):
                
                        fich.seek(num, 0) # on se deplace par rapport au numero de caractere (de 1024 a 1024 octets)
                        donnees = fich.read(1024) # Lecture du fichier en 1024 octets                            
                        socket.send(donnees) # Envoi du fichier par paquet de 1024 octets
                        num = num + 1024
                
                        # Condition pour afficher le % du transfert (pas trouve mieu) :
                        if pourcent == 0 and num > octets / 100 * 10 and num < octets / 100 * 20:
                            print(" >> 10%")
                            pourcent = 1
                        elif pourcent == 1 and num > octets / 100 * 20 and num < octets / 100 * 30:
                            print(" >> 20%")
                            pourcent = 2
                        elif pourcent < 3 and num > octets / 100 * 30 and num < octets / 100 * 40:
                            print(" >> 30%")
                            pourcent = 3
                        elif pourcent < 4 and num > octets / 100 * 40 and num < octets / 100 * 50:
                            print(" >> 40%")
                            pourcent = 4
                        elif pourcent < 5 and num > octets / 100 * 50 and num < octets / 100 * 60:
                            print(" >> 50%")
                            pourcent = 5
                        elif pourcent < 6 and num > octets / 100 * 60 and num < octets / 100 * 70:
                            print(" >> 60%")
                            pourcent = 6
                        elif pourcent < 7 and num > octets / 100 * 70 and num < octets / 100 * 80:
                            print(" >> 70%")
                            pourcent = 7
                        elif pourcent < 8 and num > octets / 100 * 80 and num < octets / 100 * 90:
                            print(" >> 80%")
                            pourcent = 8
                        elif pourcent < 9 and num > octets / 100 * 90 and num < octets / 100 * 100:
                            print(" >> 90%")
                            pourcent = 9

            else: # Sinon on envoi tous d'un coup
                donnees = fich.read()
                socket.send(donnees)

            fich.close()
            print("")
            print(time.strftime(" >> Le %d/%m a %H:%M transfert termine !"))
            time.sleep(0.1) # Attente pour éviter que les donnés du fichier ne se mélange avec le "BYE"
            socket.send("BYE".encode("utf8")) # Envoi comme quoi le transfert est fini

##################################################################
# CREATION DU SERVEUR
##################################################################
else :

    print(" >> Creation du serveur (le pare feu peut alerter)")
    socket.bind(("0.0.0.0", 2110)) # Creation du serveur
    socket.listen(1) # Mise en ecoute d'un client
    
    print(" >> Attente d'une nouvelle connexion...")
    conn, adresse = socket.accept() # accepte le client

    print("")
    print(" >> Vous etes connecte avec : " + adresse[0])
    print("")

    accepte = "non"
    num = 0
    pourcent = 0
    # Boucle temps que l'ont est connecte
    ############################################
    while (conn.connect):
        recu = ""
        recu = conn.recv(1024)
        if not recu : break

        if accepte == "non": # Condition si on a pas deja envoyer le nom et la taille du fichier
            recu = recu.decode("utf8")
            nomFich = recu.split("NAME ")[1]
            nomFich = nomFich.split("OCTETS ")[0]
            taille = recu.split("OCTETS ")[1]
            print(" >> Fichier '" + nomFich + "' [" + taille + " Ko]")

            accepte = input(" >> Acceptez vous le transfert [o/n] : ") # demande si on accepte ou pas le transfert                               

            if accepte == "o" or accepte == "oui": # Si oui en lenvoi au client et on cree le fichier
                conn.send("GO".encode("utf8"))
                print(time.strftime(" >> [%H:%M] transfert en cours veuillez patienter..."))
                print("")
                f = open(nomFich, "wb")
                identifier = "oui"
                taille = int(float(taille) * 1024) # Conversion de la taille en octets pour le %
                                    
            else :
                conn.send("Bye".encode("utf8")) # Si pas accepte on ferme le programme
                exit()

        
        elif recu == "BYE".encode("utf8"): # Si on a recu "BYE" le transfer est termine
            f.close()
            print("")
            print(time.strftime(" >> Le %d/%m a %H:%M transfert termine !"))
            
        else: # Sinon on ecrit au fur et a mesure dans le fichier
            f.write(recu)

            if taille > 1024: # Si la taille est plus grande que 1024 on s'occupe du %

                # Condition pour afficher le % du transfert :
                if pourcent == 0 and num > taille / 100 * 10 and num < taille / 100 * 20:
                    print(" >> 10%")
                    pourcent = 1
                elif pourcent == 1 and num > taille / 100 * 20 and num < taille / 100 * 30:
                    print(" >> 20%")
                    pourcent = 2
                elif pourcent < 3 and num > taille / 100 * 30 and num < taille / 100 * 40:
                    print(" >> 30%")
                    pourcent = 3
                elif pourcent < 4 and num > taille / 100 * 40 and num < taille / 100 * 50:
                    print(" >> 40%")
                    pourcent = 4
                elif pourcent < 5 and num > taille / 100 * 50 and num < taille / 100 * 60:
                    print(" >> 50%")
                    pourcent = 5
                elif pourcent < 6 and num > taille / 100 * 60 and num < taille / 100 * 70:
                    print(" >> 60%")
                    pourcent = 6
                elif pourcent < 7 and num > taille / 100 * 70 and num < taille / 100 * 80:
                    print(" >> 70%")
                    pourcent = 7
                elif pourcent < 8 and num > taille / 100 * 80 and num < taille / 100 * 90:
                    print(" >> 80%")
                    pourcent = 8
                elif pourcent < 9 and num > taille / 100 * 90 and num < taille / 100 * 100:
                    print(" >> 90%")                  
                    pourcent = 9
                    
                num = num + 1024


il peut rester quelques erreurs de ma part, donc n’hésiter pas à me dire si il y a un problème dans le code !
(Et désolé pour toutes les fautes d’orthographes et les erreurs de grammaires, je suis nul en français)