F
F
fuck__you__durov2016-09-07 12:44:39
Python
fuck__you__durov, 2016-09-07 12:44:39

How to send an image to a client in python?

The client sends a small amount of data to the server, a graph is built there and sent back. But the client only receives half of the image
client

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()


server
#Модуль 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()

image on the server
eee05c73f0db4eaa8b0be2cc8242996c.png
image received by the client

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question