Следующая пара программ демонстрирует один из способов передачи связанного объекта ndarray
через сетевой сокет.Клиент преобразует массив в поток байтов с помощью метода save
, записывая поток в объект BytesIO, который затем отправляется через сокет на сервер:
import numpy as np
import socket
from io import BytesIO
# Create an output socket connected to server
sout = socket.create_connection(('127.0.0.1', 6543))
# Create data and write binary stream out to socket
a = np.array([[1.1, 2.2, 3.3],
[4.4, 5.5, 6.6],
[7.7, 8.8, 9.9]])
b = BytesIO()
np.save(b, a)
sout.send(b.getvalue())
sout.close()
Сервер прослушивает в соответствующей сетиадрес, получая данные до закрытия конечного сокета.Затем он преобразует полученные данные в объект BytesIO
, из которого функция numpy load
восстанавливает структуру:
import numpy as np
import socket
from io import BytesIO
# Create socket listening on correct port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 6543))
s.listen()
# Accept a connection and receive data
sock, address = s.accept()
data = b''
while True:
indt = sock.recv(1024)
if not indt:
break
data += indt
# Take data and recast to np.ndarray
data = BytesIO(data)
b = np.load(data)
print(type(b), b, sep='\n')
Результат работы сервера следующий:
<class 'numpy.ndarray'>
[[1.1 2.2 3.3]
[4.4 5.5 6.6]
[7.7 8.8 9.9]]
Существуют различные способы оптимизации этого кода, но этого должно быть достаточно для начала работы.