Код слишком ненастоящий - минимальный , поэтому вот минимальный пример загрузки незашифрованного файла.Кроме того, TCP является потоковым протоколом, и использование спящих для разделения ваших данных некорректно.Вместо этого определите протокол для потока байтов.Это протокол моего примера:
- Откройте соединение.
- Отправьте имя в кодировке UTF-8, а затем новую строку.
- Отправьте закодированный файлразмер в десятичном виде с последующим переводом строки.
- Отправьте байты файла.
- Закройте соединение.
Примечание Код Python 3.Python 2 мертв для меня.Поддержка заканчивается в следующем году, так что обновите!
server.py
from socket import *
import os
CHUNKSIZE = 1_000_000
# Make a directory for the received files.
os.makedirs('Downloads',exist_ok=True)
sock = socket()
sock.bind(('',5000))
sock.listen(1)
with sock:
while True:
client,addr = sock.accept()
# Use a socket.makefile() object to treat the socket as a file.
# Then, readline() can be used to read the newline-terminated metadata.
with client, client.makefile('rb') as clientfile:
filename = clientfile.readline().strip().decode()
length = int(clientfile.readline())
print(f'Downloading {filename}:{length}...')
path = os.path.join('Downloads',filename)
# Read the data in chunks so it can handle large files.
with open(path,'wb') as f:
while length:
chunk = min(length,CHUNKSIZE)
data = clientfile.read(chunk)
if not data: break # socket closed
f.write(data)
length -= len(data)
if length != 0:
print('Invalid download.')
else:
print('Done.')
client.py
from socket import *
import os
CHUNKSIZE = 1_000_000
filename = input('File to upload: ')
sock = socket()
sock.connect(('localhost',5000))
with sock,open(filename,'rb') as f:
sock.sendall(filename.encode() + b'\n')
sock.sendall(f'{os.path.getsize(filename)}'.encode() + b'\n')
# Send the file in chunks so large files can be handled.
while True:
data = f.read(CHUNKSIZE)
if not data: break
sock.sendall(data)