Я пытаюсь создать приложение на python для синхронизации целевого каталога с резервным каталогом, используя клиентские и серверные сценарии python.
Мне удалось заставить клиента отправить один файл на сервер и правильно его записать. Однако мне также нужно отправить контрольное сообщение, указывающее, что сервер должен делать с файлом (добавить, удалить или изменить файл). У меня проблемы с добавлением нескольких файлов одновременно с «контрольным сообщением».
При отправке более одного файла одновременно сервер правильно получает все данные, отправленные ему клиентом, однако записывает все это в один отдельный файл, включая последующие «управляющие сообщения». Я пытался заставить сервер распознавать пустую строку, отправленную, когда клиент достигает конца файла, но это не работает.
Вот мой код:
Client.py
import socket
import keyboard
import os
import time
class Client:
def __init__(self, port):
self.port = port
self.s = socket.socket()
def setDirectory(self):
print("Please enter the filepath to the directory you want to track")
self.dir = input()
print("%s is now being tracked" % self.dir)
self.old = dict ([(f, None) for f in os.listdir (self.dir)])
def socketCleanup(self):
self.s.shutdown(socket.SHUT_RDWR)
self.s.close()
def sendChanges(self, added, removed):
self.s.connect(('127.0.0.1', self.port))
print("Connected")
if len(added) > 0:
for filename in added:
self.s.send("add".encode())
f = open((self.dir + filename),'rb')
l = f.read(1)
while (l):
print("Sending...")
print(l.decode("utf-8"))
self.s.send(l)
l = f.read(1)
f.close()
print("Done Sending")
if len(removed) > 0:
pass
self.socketCleanup()
def monitor(self):
self.new = dict ([(f, None) for f in os.listdir (self.dir)])
self.added = [f for f in self.new if not f in self.old]
self.removed = [f for f in self.old if not f in self.new]
for filenames in self.added:
print(filenames)
if (len(self.added) + len(self.removed)) > 0 :
self.sendChanges(self.added, self.removed)
else:
print("No Changes")
self.added.clear()
self.removed.clear()
self.old = self.new
fileClient = Client(1234)
fileClient.setDirectory()
while 1:
time.sleep (10)
try:
if keyboard.is_pressed('d'):
os.system('clear')
dropboxClient.setDirectory()
if keyboard.is_pressed('c'):
break
except:
print("The d key needs to be pressed in order to change the directory")
fileClient.monitor()
fileClient.socketCleanup()
Server.py
import socket
class Server:
backupdir = path_to_backup_directory
nextname = "file"
number = 1
def __init__(self, port):
self.port = port
self.s = socket.socket()
self.connect()
def connect(self):
self.s.bind(('', self.port))
self.s.listen(1)
print("socket is listening")
self.c, self.addr = self.s.accept()
def closeConnection(self):
st='Sync Complete'
byt=st.encode()
self.c.send(byt)
def addFile(self):
f = open((self.backupdir + self.nextname), 'w+')
l = self.c.recv(1)
while (l.decode("utf-8")):
print("Receiving...")
f.write(l.decode("utf-8"))
print(l.decode("utf-8"))
l = self.c.recv(1)
f.close()
self.nextname = "file" + str(self.number)
print("here")
self.number += 1
def deleteFile():
pass
def rewriteFile():
pass
fileServer = Server(1234)
while 1:
command = fileServer.c.recv(3).decode("utf-8")
if command == "add":
fileServer.addFile()
elif command == "del":
fileServer.deleteFile()
elif command == "rwr":
fileServer.rewriteFile()
else:
pass
Кроме того, я очень плохо знаком с python, поэтому не уверен, правильно ли я поступлю. Любой совет будет принята с благодарностью.