@ZERRITO
Пустой ноль

Как отправить изображение используя socket?

Вечера. Итак, я поинтересовался сокетами в питоне. Захотел отправить картинку.
Посмотрел код в интернете - не подходит. Попытался написать сам на основе того, что уже увидел.
server
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", 9999))
data, addr = sock.recvfrom(1024)
print(data.decode(), addr)
with open("mi.png", "rb") as mifile:
    midata = mifile.read(1024)
    while midata:
        sock.sendto(midata, addr)
        midata = mifile.read(1024)
print("Done.")
sock.close()


client
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.connect(("localhost", 9999))
sock.send("Hello, Server!".encode())
with open("mi2.png", "ab") as mifile:
    data = sock.recv(1024)
    while data:
        mifile.write(data)
        data = sock.recv(1024)
print("Done.")
sock.close()


Первое сообщение со стороны клиента отсылается, сервер завершает свою работу, но данные не записываются. Первым моим решением было:
server
with open("mi.png", "rb") as mifile:
    midata = mifile.read()
    while midata:
        sock.sendto(midata, addr)


client
with open("mi2.png", "wb") as mifile:
    mifile.write(sock.recv(1024))


В таком случае файл сохранялся, но был повреждён (Сохранялся вес оригинального файла, но места на диске занимал 0). Во втором же случае не записывается вообще ничего (0 что там, что там.).

Как можно решить?
  • Вопрос задан
  • 1310 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну для начала, выучи разницу между TCP (SOCK_STREAM) и UDP (SOCK_DGRAM).
В последнем случае у тебя НЕ ГАРАНТИРУЕТСЯ ни факт доставки сообщений, ни их правильный порядок, да и на размер сообщения есть ограничения. Также сервер без понятия, когда клиент закончил отправку сообщений.

Так что лучше разберись, как установить (и корректно закрыть!) TCP соединение и перепиши скрипт на него.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы