Partage
  • Partager sur Facebook
  • Partager sur Twitter

Client/Serveur envois de fichier

Programme qui transfert des fichiers en local/internet?

    30 novembre 2015 à 13:40:39

    Bonjour OpenClassRooms,

    J'essaye actuellement de crée un petit programme très simple me permettant d'envoyer des fichier(Par exemple une musique ou un film) d'un ordinateur à un autre.

    Mon programme fonctionne parfaitement de mon pc à mon pc (C'est a dire quand je lance le client et le serveur sur la même machine) Cela dis, lorsque j'essaye de reproduire l’expérience avec deux pc(C'est un peu le but du programme) alors ça coince. 

    Je n'arrives à comprendre l'erreur(?) que j'ai commise et je viens donc poser ma question ici. Si quelqu'un a une idée de mon erreur et si cette personne peut m'orienter pour que je puisse là comprendre ?

    Je vous remercie d'avance .

    Voici le code :

    import socket
    
    
    host=''
    port=12844
    
    clienom = "Moi"
    
    
    
    connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion_principale.bind((host,port))
    connexion_principale.listen(5)
    
    connexion_avec_client, infos_connexion = connexion_principale.accept()
    
    print("Le client :",infos_connexion,"viens de se connecter")
    
    msg_recu = b""
    while msg_recu != b"fin":
        msg_recu = connexion_avec_client.recv(1024) 
        print(clienom,"dit :",msg_recu.decode())
        
    
    
        if msg_recu == b"fichier": #si recois fichier alors prépare a recevoir fichier
            nom_fichier = connexion_avec_client.recv(1024)
            tailleFichier = connexion_avec_client.recv(1024)
            with open("copy" + nom_fichier.decode(),"wb") as fichier:
                
                reste = int(tailleFichier)/1024
                i = 1
                c = int(i*1024/int(tailleFichier)*100)
                for By in range(int(int(tailleFichier)/1024)): 
                    contenus = connexion_avec_client.recv(1024)
                    fichier.write(contenus)
                    if int(i*1024/int(tailleFichier)*100) != c:
                        print(int(i*1024/int(tailleFichier)*100), "%")
                        c = int(i*1024/int(tailleFichier)*100)
                    i+= 1
                    
                if reste != 0:
                    contenus = connexion_avec_client.recv(1024)
                    fichier.write(contenus)
                    print("100%")
                    
                else:
                    pass             
            
    print("Fin de la connexion")
    connexion_avec_client.close()
    connexion_principale.close()
    


    avec :

    import socket
    import os
    
    host='localhost'
    port = 12844
    
    
    
    
    connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion_avec_serveur.connect((host,port))
    
    #nom du fichier
    
    
    msg_envoyer = b"" 
    while msg_envoyer != b"fin":            
        
        msg_envoyer = input(">>> ") 
        msg_envoyer = msg_envoyer.encode()
        connexion_avec_serveur.send(msg_envoyer)
        
        if msg_envoyer.decode() == "fichier":
            nom_fichier = input("Quel est le nom du fichier a envoyer?")
            nom_fichier = nom_fichier.encode()
            connexion_avec_serveur.send(nom_fichier)
            #taille de l'objet
            tailleFichier = str(os.path.getsize(nom_fichier))
    
            
            connexion_avec_serveur.send(tailleFichier.encode())
            
            
            
            with open(nom_fichier,"rb") as fichier:
                
                reste = int(tailleFichier)/1024
                
                for By in range (int(int(tailleFichier)/1024)):
                    contenus = fichier.read(1024)
                    connexion_avec_serveur.send(contenus)
                    
                if reste != 0:
                    contenus = fichier.read(1024)
                    connexion_avec_serveur.send(contenus)
                    
                else:
                    pass
                    
                   
                connexion_avec_serveur.send(b"find")   
                print("terminer")
    connexion_avec_serveur.close()
    

    PS : Bien entendu je modifie l'ip en fonction de la machine

    -
    Edité par Palams 30 novembre 2015 à 13:41:24

    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2015 à 11:44:26

      La machine sur laquelle se trouve le serveur ne peut pas être trouvée par une connexion extérieure sans que tu fasses un port forwarding. Disons que ta machine avec le serveur se trouve à l'IP locale 192.168.1.3, alors tu devras configurer ton router pour forwarder toutes les connexions extérieures sur le port 12844 vers l'adresse 192.168.1.3. Pour une explication sur la raison du port forwarding, tu peux regarder ceci: http://superuser.com/questions/284051/what-is-port-forwarding-and-what-is-it-used-for

      Ce n'est pas nécessaire du côté client car la connexion est déjà établie. Voir ceci: http://superuser.com/questions/265877/why-is-port-forwarding-necessary-for-servers-but-not-for-clients

      • Partager sur Facebook
      • Partager sur Twitter
        1 décembre 2015 à 16:27:18

        Je te remercie de ta réponse, effectivement j'ai bien fais de venir posé ma question, j'imaginais plutôt une erreur de "prog".

        Je vais prendre connaissance de tes liens et essayer de comprendre comment fonctionne/utiliser tout ça.

        • Partager sur Facebook
        • Partager sur Twitter

        Client/Serveur envois de fichier

        × 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