Отправка файлов png через python сокетов - PullRequest
0 голосов
/ 14 марта 2020

Я настроил python клиента и сервер с сокетом в Python, который позволяет серверу отправлять текст клиенту, и я пытался расширить его, чтобы изображения могли быть отправлены клиенту .

Код сервера:

import socket

#setup and bind server socket
s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#setup socket
s_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#reuses same port (allows reconnection)
s_socket.bind(('192.168.178.52', 9001))

s_socket.listen(1)

#connects and prints clients data and send message
clientsocket, address = s_socket.accept()
print('Connection from {}'.format(address))
clientsocket.send(bytes('Welcome to the server', 'utf-8'))

#Loops for server to sent text data to client


while True:
    m = input('Enter')
    try:
        file = open(m, 'rb')
        b = file.read(2048)
        clientsocket.send(b)
    except:
        clientsocket.send(bytes(m, 'utf-8'))

Код клиента:

import socket
import webbrowser
import os
import pyautogui

#setup and bind client socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect(('----------', 9001))#ip swapped for post

while True:
    message = s.recv(2048)#recieves all messages sent with buffer size
    if message:
        txt = str(message)
        with open('plswork.png', 'wb') as file:
            file.write(message)
            file.close()

Проблема, с которой я столкнулся, заключается в том, что он отправит файл и создаст его безупречно. , но только часть изображения загрузится, когда я открою его (см. изображение). Я почти уверен, что это как-то связано с размером буфера, однако, когда я его увеличиваю, он вообще не распознает файл, и я получу ошибка при попытке открыть фотографию (желательно, чтобы вы могли отправить большинство фотографий). Новое в python сокетах, поэтому любая помощь будет оценена!

(в данный момент пытается отправить пи c смокинга ...)

https://i.stack.imgur.com/lBblq.png

1 Ответ

0 голосов
/ 14 марта 2020

Я не знаю размер файла, но разве вы не должны читать файл до тех пор, пока он не будет прочитан полностью и отправлять данные кусками?

while True:
    m = input('Enter')
    try:
        file = open(m, 'rb')
        while True:
            b = file.read(2048)
            if not b:
                break
            clientsocket.send(b)
    except:
        clientsocket.send(bytes(m, 'utf-8'))

Необходимо было также адаптировать клиентскую сторону .

Большинство сетевых протоколов добавляют дополнительную информацию для упрощения приема.

Например, может быть хорошей идеей, если вы сначала отправите количество байтов, которое содержит приветственное сообщение, затем приветствие сообщение, затем какой-то индикатор, что вы отправите файл, затем некоторую информацию, сколько байтов вы отправите для изображения и только затем байты изображения

Вы также узнаете, что это сложно чтобы клиент знал, что такое текстовое сообщение и что является частью файла png.

Фактически, если вы удалите команду input() с сервера и жестко закодируете имя файла, которое вы, вероятно, заметите. чтобы приветственное сообщение и png-файл могли прибыть вместе на стороне клиента. и было бы трудно разделить их.

Поэтому, чтобы сделать ваш код устойчивым, нужно много работы.

...