#python #sockets
#python #сокеты
Вопрос:
Я хочу создать очень простой сервер, который принимает файлы разных типов от клиентов. Проблема в том, что я не могу получить имя файла, отправленное с клиента, поэтому все файлы сохраняются как одно имя файла, независимо от того, как называется файл.
Это мой client.py:
import socket
with socket.socket() as s:
s.connect(('192.168.1.2',10000))
with open('Image.jpg','rb') as f:
s.sendall(f.read())
И это мой server.py:
import socket
print("Server started")
while True:
with socket.socket() as s:
s.bind(('192.168.1.2',10000))
s.listen(1)
with s.accept()[0] as c:
chunks = []
while True:
chunk = c.recv(4096)
if not chunk: break
chunks.append(chunk)
print("Receiving file")
with open('Image.jpg','wb') as f:
f.write(b''.join(chunks))
print("File Received")
Который работает нормально. Проблема начинается с того, что если я отправлю другой файл, например «data.csv», он все равно будет сохранен как «Image.jpg «на сервере.
Есть ли какой-либо способ сохранить имя файла вместе с файлом?
Комментарии:
1. Может быть, вы могли бы включить это в качестве заголовка или в виде сообщения перед изображением?
2. Отправка файлов в виде открытого текста в наши дни не самая лучшая идея, вы рассматривали возможность использования
scp
?3. Вам нужно будет создать проводной протокол, который позволяет включать имя файла (или использовать тот, который уже может это делать, например, ftp …)
Ответ №1:
Что я обычно делаю, так это отправляю имя файла перед данными:
import socket
print("Server started")
while True:
with socket.socket() as s:
s.bind(('192.168.1.2',10000))
s.listen(1)
with s.accept()[0] as c:
chunks = []
while True:
filename = c.recv(1600)
filename = filename.decode()
chunk = c.recv(4096)
if not chunk: break
chunks.append(chunk)
print("Receiving file")
with open(filename,'wb') as f:
f.write(b''.join(chunks))
print("File Received")
Клиент:
import socket
import time
with socket.socket() as s:
s.connect(('192.168.1.2',10000))
with open('Image.jpg','rb') as f:
s.sendall('Image.jpg'.encode())
time.sleep(3)
s.sendall(f.read())