@fuck__you__durov

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

Клиент отправляет небольшой массив данных на сервер, там строиться график и отправляется обратно. Но клиент получает только половину изображения
клиент
from socket import *
import sys
import openpyxl
import matplotlib.pyplot as plt

wb = openpyxl.load_workbook(filename = 'obj.xlsx')
sheet = wb['1']
#считываем значение определенной ячейки
val = sheet['A2'].value
#считываем заданный диапазон
X = [v[0].value for v in sheet.range('A1:A10')]
Y = [v[0].value for v in sheet.range('C1:C10')]

host = 'localhost'
port = 777
addr = (host,port)

tcp_socket = socket(AF_INET, SOCK_STREAM)
tcp_socket.connect(addr)

data = str(X+Y)
print ('output: ',data)

#encode - перекодирует введенные данные в байты, decode - обратно
data = str.encode(data)
tcp_socket.send(data)
data = bytes.decode(data)
data = tcp_socket.recv(10240)
#print('input: ',data)
plt = open('graf.png','wb')
plt.write(data)
#plt.show()


tcp_socket.close()


сервер
#Модуль socket для сетевого программирования
from socket import *
import re
import matplotlib.pyplot as plt
#данные сервера
host = 'localhost'
port = 777
addr = (host,port)

#socket - функция создания сокета 
#первый параметр socket_family может быть AF_INET или AF_UNIX
#второй параметр socket_type может быть SOCK_STREAM(для TCP) или SOCK_DGRAM(для UDP)
tcp_socket = socket(AF_INET, SOCK_STREAM)
#bind - связывает адрес и порт с сокетом
tcp_socket.bind(addr)
#listen - запускает прием TCP
tcp_socket.listen(1)

#Бесконечный цикл работы программы
while True:
    
    #Если мы захотели выйти из программы
    question = input('Do you want to quit? y\\n: ')
    if question == 'y': break
    
   #print('wait connection...')
    
    #accept - принимает запрос и устанавливает соединение, (по умолчанию работает в блокирующем режиме)
    #устанавливает новый сокет соединения в переменную conn и адрес клиента в переменную addr
    conn, addr = tcp_socket.accept()
    print('client addr: ', addr)
    
    #recv - получает сообщение TCP
    data = conn.recv(1024)
    datax = bytes.decode(data)
    
    x = re.findall('(\d+)', datax)
    a = x
    i=0
    print (x[1])
    while i<20:
        a[i]=int(x[i])
        print ('x ',a[i])
        
        i=i+1

    X=a[0:10]
    Y=a[10:20]
    print('x= ',X,'y= ',Y)
    fig = plt.figure()   # Создание объекта Figure
    print (fig.axes)   # Список текущих областей рисования пуст
    print (type(fig))   # тип объекта Figure
    plt.scatter(X, Y)   
    plt.xlabel('X axes');
    plt.ylabel('Y axes');
# После нанесения графического элемента в виде маркера
# список текущих областей состоит из одной области
    print (fig.axes)

# смотри преамбулу
    plt.savefig('example.png', fmt='png')
    data = open('example.png','rb+')
    #datan = png.encode(data)
    #plt.show()
    
    #если ничего не прислали, завершим программу
    if not data:
        print('EROR')
        conn.close()
       
        break
    else:
        #print('output: ',data)
        #send - передает сообщение TCP
        conn.sendfile(data)
        #close - закрывает сокет
        conn.close()
    data.close()
tcp_socket.close()

изображение на сервере
eee05c73f0db4eaa8b0be2cc8242996c.png
изображение полученное клиентом
  • Вопрос задан
  • 1363 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы