Невозможно передать большое изображение (около 5 МБ) из экземпляра openstack на обычную машину с помощью python-сокета

Я пытаюсь отправить большое изображение размером около 5 МБ из Openstack Instance на обычную Linux-машину, используя сокет сервера Python и код сокета клиента. Но не удалось получить полное изображение, только часть его только получая.

Я использовал ссылку ниже для ссылки на код. TCP клиент / сервер с сокетами, сервер отправляет файлы клиентам, клиент зависает, Python

#!/usr/bin/env python

import random
import socket, select
from time import gmtime, strftime

image = 'tux.png'

HOST = '0.0.0.0'
PORT = 8082

connected_clients_sockets = []

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(10)

connected_clients_sockets.append(server_socket)

while True:

    read_sockets, write_sockets, error_sockets = select.select(connected_clients_sockets, [], [])

    for sock in read_sockets:

        if sock == server_socket:

            sockfd, client_address = server_socket.accept()
            connected_clients_sockets.append(sockfd)

        else:
            try:
                data = sock.recv(4096)

                if data :

                    txt = data.strip()
                    print '--%s--'%txt

                    if txt == 'GET' :
                        sock.sendall('OK\r\n')

                    elif txt == 'GET_SIZE' :

                        with open ('tux.png','rb') as f1:
                            file_size = len(f1.read())
                            f1.seek(0)

                        print '--%s--'%file_size

                        file_size = '%s' % file_size
                        sock.sendall('SIZE %s\r\n' % file_size)

                    elif txt == 'GET_IMG' :
                        with open(image, 'rb') as fp:
                            image_data = fp.read()

                        msg = '%sEOF\r\r' % image_data
                        sock.sendall(msg)
                        print msg

            except:
                sock.close()
                connected_clients_sockets.remove(sock)
                continue

server_socket.close()

И код клиента приведен ниже

client.py

#!/usr/bin/env python

import socket
import sys

HOST = '10.x.y.z' #Machine IP where server is running
PORT = 8082

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (HOST, PORT)
sock.connect(server_address)
fname = 'fromserver.png'

try:

    sock.sendall("GET\r\n")
    data = sock.recv(4096)

    if data:
        txt = data.strip()
        print '--%s--' % txt

        if txt == 'OK':

            sock.sendall("GET_SIZE\r\n")
            data = sock.recv(4096)

            if data:
                txt = data.strip()
                print '--%s--' % txt

                if txt.startswith('SIZE'):

                    tmp = txt.split()
                    size = int(tmp[1])

                    print '--%s--' % size

                    sock.sendall("GET_IMG\r\n")

                    myfile = open(fname, 'wb')

                    amount_received = 0
                    while amount_received < size:
                        data = sock.recv(4096)
                        if not data :
                            break
                        amount_received += len(data)
                        print amount_received

                        txt = data.strip('\r\n')

                        if 'EOF' in str(txt) :
                            print 'Image received successfully'
                            myfile.write(data)
                            myfile.close()
                        else :
                            myfile.write(data)
finally:
    sock.close()

Выше обе программы, которые я использую для передачи изображения с помощью сокета Python. И я могу успешно отправить изображение, если я запускаю код server.py на обычном компьютере с Linux и могу успешно получить полный образ, когда я запускаю код client.py в экземпляре openstack. Но когда я делаю обратное, то есть, выполняя код server.py на openstack Instance и client.py на обычном Linux-компьютере, я получаю только часть изображения, а не полный образ (каждый раз, когда я запускаю код сервера и клиента, случайным образом получаются разные размеры изображений 295k, 85k, 1MB и 3.4B и т. д.).

Так что думал разбить большое изображение на куски и отправить его. Так что ссылка была ниже, но я не получил много информации, и серверный и клиентский код, который использовал методы pack(), unpack(), не работал для меня. Как правильно отправлять большое количество данных через сокеты в Python?,

Я также просматривал ссылки ниже https://www.codeproject.com/Questions/1075184/How-to-send-large-file-from-client-to-server

http://smallvoid.com/article/tcpip-mtu-size.html

Поэтому я попытался изменить размер буфера до 1500, 2048 и других размеров в коде client.py, но столкнулся с той же проблемой.

Если кто-нибудь знает, как разбить большое изображение на куски и отправить его по сети, пожалуйста, предложите мне.

И в чем может быть причина неполучения полного образа на стороне клиента в случае, когда server.py работает на экземпляре Openstack. Но тот же код работает, когда я запускаю серверный код на обычной машине с Linux?.

Если нужно больше деталей, пожалуйста, оставьте комментарий.

0 ответов

Другие вопросы по тегам