2017-06-19 32 views
0

我正在致力于client-server文件共享以更新特定文件夹。客户端使用tcp-socket连接到服务器并接收特定zip-file然后解压缩。到目前为止,我已经完成了这一工作,但我想比较两个文件夹(客户端和服务器)中的文件以检查文件内容(即:更新文件)的差异,并且只在内容不同时才下载文件。使用tcp套接字比较客户端和服务器之间的文件

我的代码

客户:

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

服务器:

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

我迄今为止尝试:

我试过filecmp.dircmp但它只检查不同的文件,而不是不同的文件内容,我也无法比较客户端和服务器的文件夹。我还试图通过文件loop并在每个文件上使用filecmp,但我也无法将它与来自服务器的同一文件进行比较。

有没有一种有效的方法来做到这一点?

回答

1

不知道我知道您在使用filecmp来比较从服务器下载客户端的内容之前。在这些情况下,通常有两种方法:合并协议以检查服务器中文件的修改日期(例如os.path.getmtime(file_name)),然后确保在客户端下载文件时设置修改日期;要么;让客户端请求哈希文件并在哈希不匹配时下载。

+0

谢谢!经过一些测试后,我终于按照你的建议使用'os.path.getmtime(filename)'来工作。我唯一担心的是,我现在正在将'modified-date'从服务器发送到客户端,并将其作为'socket.recv(1024)'接收,这对所有情况都适用吗?接收(1024)? –

+0

'getmtime'返回一个浮点数,根据这个其他答案,python中的浮点数为64位:https://stackoverflow.com/questions/8216088/how-to-check-the-size-of-a-float- in-python,但这是一个时间戳,因此您将获得的合理值将远远小于此值。 –

相关问题