Vous n'êtes pas identifié(e).
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:
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
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