Я сейчас работаю над системой обмена файлами p2p в python3 и столкнулся с проблемой, которую не знаю, как именно исправить.
У меня есть одноранговые узлы с серверным процессом и клиентский процесс, где клиентский процесс подключается к другим узлам, помещает его в свой собственный поток и прослушивает данные через сокет. При загрузке только с одного другого узла файл записывается правильно, без проблем, но если он разделен на несколько узлов, файл поврежден. Данные правильно получены от обоих других пиров, поэтому я думаю, что это будет проблема записи файла.
Когда я получаю данные от пира, я открываю файл, ищу место, куда поступают данные от, а затем запишите его и закройте файл. Решением этой проблемы могут быть блокировки?
Это код в своем собственном потоке, который постоянно прослушивает
def handleResponse(clientConnection, fileName, fileSize):
# Listen for connections forever
try:
while True:
#fileName = ""
startPos = 0
data = clientConnection.recv(2154)
# If a response, process it
if (len(data) > 0):
split = data.split(b"\r\n\r\n")
#print(split[0])
headers = split[0].replace(b'\r\n', b' ').split(b' ')
# Go through the split headers and grab the startPos and fileName
for i in range(len(headers)):
if (headers[i] == b"Range:"):
startPos = int(headers[i+1])
#fileName = headers[i+2].decode()
break
# Write the file at the seek pos
mode = "ab+"
if (startPos == 0):
mode = "wb+"
with open ("Download/" + fileName, mode) as f:
f.seek(startPos, 0)
f.write(split[1])
f.close()