Огромная потеря данных при отправке изображения через сокет в python - PullRequest
0 голосов
/ 16 марта 2020

Я попытался отправить изображение через сокет в python. При отправке его с моего компьютера на мой компьютер прекрасно работает , но при попытке отправить его с моего компьютера на другой компьютер изображение не доставляется или получается неправильно. По какой-то причине размер файла .jpg увеличился с 2,67 МБ до 1,73 МБ ... Вот сервер и клиент, а также изображение до и после его отправки. Кто-нибудь знает, почему и как это исправить?

Server.py

import socket


def main():
    server_socket = socket.socket()
    server_socket.bind(('0.0.0.0', 8118))

    server_socket.listen(1)

    (client_socket, client_address) = server_socket.accept()
    length = client_socket.recv(7)
    length = int(length)
    data = ""
    if length > 10000:
        dev = length / 10000
        for i in range(0, dev):
            data = data + client_socket.recv(10000)
            length = length - 10000
    data = data + client_socket.recv(length)
    f = open('test.jpg', "wb")
    f.write(data.decode('base64'))
    f.close()

    client_socket.close()
    server_socket.close()


if __name__ == '__main__':
    main()

Client.py

import socket
import base64


def main():
    my_socket = socket.socket()
    try:
        my_socket.connect(('192.168.0.107', 8118))
    except:
        print 'connection failed'
        my_socket.close()
        return

    with open('C:/test/test.jpg', "rb") as sfile:
        data = base64.b64encode(sfile.read())

    length = len(data)
    length = str(length)
    for i in range(len(length), 7):
        length = '0' + length
    my_socket.send(length)
    length = int(length)
    if length > 10000:
        dev = length / 10000
        for i in range(0, dev):
            my_socket.send(data[:10000])
            data = data[10000:]
            length = length - 10000
    my_socket.send(data)

    my_socket.close()


if __name__ == '__main__':
    main()

отправленное изображение screenshot.jpg

полученное изображение screenshot2.jpg

...