user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 15-02-2013 23:01:28

boost
Membre

Python socket fonction download et upload de fichier

Bonjour je vous donne un exemple déchange entre client et serveur.
Ou le client vas pouvoir uploader des fichier sur le serveur et ou il vas pouvoir downloader des fichier du serveur.

J'ai commenter le script au maximum pour plus d'information demander.
Il y a encore plusieurs erreur à gérer comme IOerror si le fichier que vous voulez downloader ou uploader n'existe pas.
C'est un exemple d'échange de fichier
avec le module threading ou select, vous pouvez créer une application qui permets d'échanger divers fichier entre client.

Script client:

[== Indéfini ==]
#! /usr/bin/python
# -*- coding:utf-8 -*-

import socket
import sys
import os
from Crypto.Cipher import AES
from Crypto import Random

# Initialisation variables

continuer = 'True'
host = 'localhost'
port = 4444
message_envoyer = ''
message_recus = ''

# Configuration AES

key = 'palsm453lkejru34'
block_size = 16
mode = AES.MODE_CFB
iv = Random.new().read(block_size)
cipher = AES.new(key, mode, iv)

# Fonction upload
  
def upload():
  cmd = os.popen('ls', 'r') # On liste les fichiers dispo sur notre machine
  print cmd.read() # On les affiches
  nom = raw_input('nom du fichier: ') # On entre le nom du fichier à uploader avec l'extension
  fichier = open(nom, 'r') # On ouvre le fichier en lecture
  nom = cipher.encrypt(nom) # On crypte le nom du fichier en aes
  c.send(nom) # On envois le nom du fichier au serveur pour qu'il puisse créer le fichier
  data = fichier.read() # On récupère toutes les données du fichier
  data = cipher.encrypt(data) # On crypte les données du fichier en aes
  c.send(data) # On envois les données crypter en aes au serveur pour qu'il puisse recréer le fichier
  message_recus = c.recv(1024) # On récupère le message qui vas nous dire si tous sais bien passer
  messages_recus = cipher.decrypt(message_recus) # on décrypte se message
  if(messages_recus == 'ok'): # Si le message vaut ok c'est que le fichier à bien été uploader par le serveur
    print "Fichier uploader avec succès"
  else:
    print "Erreur lors de l'upload du fichier"
   
# Fonction download
   
def download():
  data = c.recv(1024) # On récupère la liste des fichier sur le serveur
  data = cipher.decrypt(data) # On décrypte la liste de fichier
  print data # On affiche la liste des fichier présent dans le répertoire
  nom = raw_input('Nom du fichier: ') # On entre le nom du fichier que l'on veut télécharger avec l'extension
  fichier = open(nom, 'w') # On ouvre un fichier en écriture avec le même nom et extension
  nom = cipher.encrypt(nom) # On crypte le nom du fichier
  c.send(nom) # On envois le nom du fichier au serveur pour qu'il sachent sur qu'elle fichier travailler
  data = c.recv(10000) # On récupère les données du fichier que le serveur vient de nous envoyer
  data = cipher.decrypt(data) # On décrypte les données
  fichier.write(data) # On écrit les données pour recréer le fichier
  fichier.close() # On ferme le fichier on a fini de l'écrire
  message_recus = c.recv(1024) # On récupère le message qui vas nous dire si tout sais bien passer
  message_recus = cipher.decrypt(message_recus) # On décrypte le message
  if(message_recus == 'ok'): # Si le message vaut ok c'est que le fichier a été télécharger
    print "fichier télécharger avec succès\n"
  else:
    print "Erreur lors du téléchargement du fichier"

# Liaison tcp/ip

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connection au serveur

try:
  c.connect((host, port))
except(socket.error):
  print "Hote injoignable"
  sys.exit()

# échange client serveur

while(continuer == 'True'):
  message_recus = c.recv(1024)
  message_recus = cipher.decrypt(message_recus)
  print message_recus
  message_envoyer = raw_input('message: ')
  if(message_envoyer == 'close'):
    message_envoyer = cipher.encrypt(message_envoyer)
    c.send(message_envoyer)
    print "bye"
    sys.exit()
  elif(message_envoyer == 'upload'): # Si message_envoyer vaut upload
    message_envoyer = cipher.encrypt(message_envoyer) # On encrypte message_envoyer
    c.send(message_envoyer) # On l'envois au serveur pour le mettre au courant que l'on vas uploader un fichier
    upload() # On appel la fonction upload
  elif(message_envoyer == 'download'): # Si message_envoyer vaut download
    message_envoyer = cipher.encrypt(message_envoyer) # On encrypte message_envoyer
    c.send(message_envoyer) # On l'envois au serveur pour le mettre au courant que l'on vas télécharger un fichier
    download() # On appel la fonction download
  else:
    message_envoyer = cipher.encrypt(message_envoyer)
    c.send(message_envoyer)
  
c.close()

Script serveur:

[== Indéfini ==]
#! /usr/bin/python
# -*- coding:utf-8 -*-

import socket
import sys
import os
from Crypto.Cipher import AES
from Crypto import Random

# Initialisation variables

continuer = 'True'
host = 'localhost'
port = 4444
message_envoyer = ''
message_recus = ''

# Configuration AES

key = 'palsm453lkejru34'
block_size = 16
mode = AES.MODE_CFB
iv = Random.new().read(block_size)
cipher = AES.new(key, mode, iv)

# Fonction upload

def upload():
  nom = conn.recv(1024) # On récupère le nom du fichier que le client veut uploader
  nom = cipher.decrypt(nom) # On décrypte le nom
  fichier = open(nom, 'w') # On ouvre un fichier en écriture qui a le même nom et extension
  data = conn.recv(1024) # On récupère les données du fichier client
  data = cipher.decrypt(data) # On décrypte les données
  fichier.write(data) # On écrit notre fichier avec les données reçues par le client
  fichier.close() # On ferme notre fichier
  message_envoyer = 'ok' # On envois un message ok qui avertis le client que tout sais bien passer
  message_envoyer = cipher.encrypt(message_envoyer) # On crypte le message
  conn.send(message_envoyer) # On envois le message

# Fonction download
  
def download():
  cmd = os.popen('ls', 'r') # On ouvre la commande ls pour lister les fichier dans le répertoire courant du serveur
  data = cmd.read() # On récupère la liste des fichiers
  data = cipher.encrypt(data) # On crypte la liste
  conn.send(data) # On l'envois au client
  nom = conn.recv(1024) # On récupère le nom du fichier que le client veut télécharger
  nom = cipher.decrypt(nom) # On décrypte le nom du fichier
  fichier = open(nom, 'r') # On ouvre un fichier un lecture
  data = fichier.read() # On récupère les données de ce fichier
  data = cipher.encrypt(data) # On les cryptes
  conn.send(data) # Et on les envois au client pour qu'il puisse reconstruire le fichier
  fichier.close() # On ferme le fichier on a fini les traitements
  message_envoyer = 'ok' # On envois le message ok pour dire que tout sais bien passer de notre coter
  message_envoyer = cipher.encrypt(message_envoyer) # On crypte le message
  conn.send(message_envoyer) # On l'envois

# Liaison tcp/ip

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Liaison adresse/port

try:
  s.bind((host, port))
except(socket.error):
  print "port déja utiliser"
  sys.exit()

# Serveur en écoute

s.listen(5)
print "Serveur en attente de client \n"
conn, addr = s.accept()
print "Client connecter \n"

# Boucle échange client serveur

while(continuer == 'True'):
  message_envoyer = "Serveur 1.0"
  message_envoyer = cipher.encrypt(message_envoyer)
  conn.send(message_envoyer)
  message_recus = conn.recv(1024)
  message_recus = cipher.decrypt(message_recus)
  if(message_recus == 'close'):
    print "bye"
    sys.exit()
  elif(message_recus == 'upload'): # Si message_recu vaut upload
    upload() # On appel la fonction upload
  elif(message_recus == 'download'): # si message_recu vaut download
    download() # On appel la fonction download
  else:
    print message_recus
  
conn.close()
s.close()

Vidéo:

ovOGN.jpg

Dernière modification par boost (15-02-2013 23:17:07)


boost ===>>> « Un langage de programmation est une convention pour donner des ordres à un ordinateur. Ce n’est pas censé être obscur, bizarre et plein de pièges subtils. Ca, ce sont les caractéristiques de la magie. » - Dave Small

Hors ligne

#2 30-03-2015 23:36:09

Leo
Membre

Re : Python socket fonction download et upload de fichier

Bonjour, Merci beaucoup pour votre code.

J'essaye d'utiliser cet exemple pour chiffrer des fichiers que j'envoie depuis un serveur vers un client mais à la réception, dans chaque fichier,  les 16 premiers caractères  sont remplacés par un code  (des caractères chiffrés). 
Je ne vois pas comment vous faites dans votre code pour éviter ce problème.. Auriez-vous une idée de solution à cela?

Merci beaucoup,
Leo.

Hors ligne

Pied de page des forums