2017-06-19 1 views
0

Ich arbeite an einer Dateifreigabe client-server, um einen bestimmten Ordner zu aktualisieren. Wenn der Client eine Verbindung mit dem Server unter Verwendung von tcp-socket herstellt und eine bestimmte zip-file empfängt, entpacken Sie es. Ich habe das bisher geschafft, aber ich möchte die Dateien in beiden Ordnern (Client und Server) vergleichen, um Unterschiede in den Dateien zu finden (zB: aktualisierte Dateien) und die Dateien nur herunterladen, wenn die Inhalte unterschiedlich sind.Vergleichen von Dateien zwischen Client und Server mit TCP-Socket

Mein Code:

Auftraggeber:

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() 

Server:

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() 

Was ich bisher versucht:

Ich versuchte filecmp.dircmp, aber es prüft nur auf verschiedene Dateien und nicht auf unterschiedliche Inhalte von Dateien und ich konnte auch nicht den Ordner vom Client mit dem Ordner vom Server vergleichen. Ich habe auch versucht, loop durch Dateien und filecmp für jede Datei, aber ich konnte es auch nicht mit der gleichen Datei vom Server vergleichen.

Gibt es eine effiziente Möglichkeit, dies zu tun?

Antwort

1

Nicht sicher, ich verstehe, dass Sie filecmp verwenden, um Inhalte vom Client vor dem Download vom Server zu vergleichen. In diesen Fällen gibt es normalerweise zwei Ansätze: Integrieren Sie ein Protokoll, um das Änderungsdatum der Dateien auf dem Server zu überprüfen (z. B. os.path.getmtime(file_name)), und stellen Sie sicher, dass das Änderungsdatum festgelegt wird, wenn Ihr Client die Dateien herunterlädt. oder; Lassen Sie die Clientanforderung Hashwerte für die Dateien erstellen und laden Sie sie herunter, wenn die Hashwerte nicht übereinstimmen.

+0

Danke! Nach einigen Tests habe ich es schließlich mit "os.path.getmtime (filename)" wie vorgeschlagen funktioniert. Meine einzige Sorge ist, dass ich gerade das "Änderungsdatum" von Server zu Client sende und es als "socket.recv (1024)" empfange, wird das für alle Szenarien in Ordnung sein? empfangen (1024)? –

+0

'getmtime' gibt einen Gleitkomma zurück, wie in dieser anderen Antwort, ein Float in Python ist 64 Bit: https://stackoverflow.com/questions/8216088/how-to-check-the-size-of-a-float- In-Python, aber dies ist ein Zeitstempel, daher werden die vernünftigen Werte, die Sie erhalten, viel kleiner sein. –

Verwandte Themen