2017-06-19 2 views
0

Je travaille sur un partage de fichiers client-server pour mettre à jour un dossier particulier. Lorsque le client se connecte au serveur en utilisant tcp-socket et recevoir un zip-file particulier puis décompressez-le. J'ai accompli cela jusqu'à présent mais je veux comparer les fichiers dans les deux dossiers (client et serveur) pour vérifier la différence dans le contenu des fichiers (ie: fichiers mis à jour) et ne télécharger les fichiers que si le contenu est différent.Comparaison de fichiers entre le client et le serveur à l'aide du socket tcp

Mon code:

Client:

import socket 
import zipfile 
import os 

def main(): 
    host = '192.168.1.8' 
    port = 5000 
    s = socket.socket() 
    s.connect((host, port)) 
    with open('C:\\file.zip', 'wb') as f: 
     while True: 
      data = s.recv(1024) 
      if not data: 
       break 
      f.write(data) 
    zip_ref = zipfile.ZipFile('C:\\file.zip', 'r') 
    zip_ref.extractall('C:\\') 
    zip_ref.close() 
    os.remove('C:\\file.zip') 
    s.close() 

if __name__ == '__main__': 
    main() 

Serveur:

import socket 
from threading import Thread 

def send_file(conn, filename): 
    with open(filename, 'rb') as f: 
     print 'Sending file' 
     data = f.read(1024) 
     while data: 
      conn.send(data) 
      data = f.read(1024) 
    print 'Finished sending' 
    conn.close() 


def main(): 
    host = '192.168.1.8' 
    port = 5000 
    s = socket.socket() 
    s.bind((host, port)) 
    s.listen(5) 
    while True: 
     c, addr = s.accept() 
     t = Thread(target=send_file, args=(c, 'C:\\file.zip')) 
     t.start() 

if __name__ == '__main__': 
    main() 

Ce que j'ai essayé jusqu'à présent:

J'ai essayé filecmp.dircmp mais Il vérifie seulement pour les différents fichiers et le contenu différent des fichiers et aussi je ne pouvais pas comparer le dossier du client avec le dossier du serveur. J'ai également essayé de loop par l'intermédiaire des dossiers et employez filecmp sur chaque dossier mais je ne pourrais pas également le comparer avec le même dossier du serveur.

Existe-t-il un moyen efficace de le faire?

Répondre

1

Je ne suis pas certain de comprendre que vous utilisez filecmp pour comparer le contenu du client avant son téléchargement sur le serveur. Dans ces cas, il existe généralement deux approches: Incorporer un protocole pour vérifier la date de modification des fichiers dans le serveur (par exemple os.path.getmtime(file_name)) et assurez-vous de définir la date de modification lorsque votre client télécharge les fichiers; ou; avoir le client demande des hachages pour les fichiers et télécharger quand les hachages ne correspondent pas.

+0

Merci! Après quelques tests, j'ai finalement réussi à utiliser 'os.path.getmtime (filename)' comme vous l'avez suggéré. Ma seule préoccupation est que j'envoie actuellement le 'modified-date' du serveur au client et que je le reçois sous le nom' socket.recv (1024) ', cela conviendra-t-il à tous les scénarios? recevoir (1024)? –

+0

'getmtime' retourne un float, comme pour cette autre réponse, un float en python est 64 bits: https://stackoverflow.com/questions/8216088/how-to-check-the-size-of-a-float- in-python mais ceci est un horodatage, donc les valeurs raisonnables que vous obtiendrez seront beaucoup plus petites que cela. –