Python3 TypeError: элемент последовательности 0: ожидается байтоподобный объект, int найдено

Я пытаюсь отправить массив по TCP из серверного скрипта в клиентский. Массив является переменным, поэтому данные отправляются с использованием пакетов, а затем объединяются на клиенте.

Данные, которые я пытаюсь отправить, взяты из набора рукописных цифр MNIST для Deep Learning. Код на стороне сервера:

tcp = '127.0.0.1'
port = 1234
buffer_size = 4096
(X_train, y_train), (X_test, y_test) = mnist.load_data()
test_data = (X_test, y_test)

# Client-side Deep Learning stuff

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((tcp, port))
x = pickle.dumps(test_data)
s.sendall(x)
s.close()

Клиентский скрипт загружает нейронную сеть, которая использует тестовые данные для прогнозирования классов. Скрипт для прослушивания указанных данных:

tcp = '127.0.0.1'
port = 1234
buffer_size = 4096

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((tcp, port))
print ('Listening...')
s.listen(1)

conn, addr = s.accept()
data_arr = []

while True:
    data_pack = conn.recv(buffer_size)
    if not data: break
    data_pack += data

my_pickle = b"".join(data_pack)
test_data = pickle.loads(my_pickle)
print ("Received: " + test_data)
conn.close()

# Irrelevant Deep Learning stuff...

Сервер отправляет данные без помех, но клиент аварийно завершает работу при попытке присоединить пакеты, полученные клиентом (my_pickle = ...), со следующей ошибкой:

TypeError: sequence item 0: expected a bytes-like object, int found

Как мне отформатировать объединение, чтобы воссоздать отправленные данные и использовать его для остальной части сценария?

1 ответ

Решение

В итоге я использовал Pickle и ZeroMQ для обработки протокола связи. Преимущество этого метода в том, что я могу отправить более одного пакета данных.

На стороне клиента:

ip = '127.0.0.1'
port = '1234'

# ZeroMQ context
context = zmq.Context()

# Setting up protocol (client)
sock = context.socket(zmq.REQ)
sock.bind('tcp://'+ip+':'+port)
print('Waiting for connection at tcp://'+ip+':'+port+'...')
sock.send(pickle.dumps(X_send))
X_answer = sock.recv()
sock.send(pickle.dumps(y_send))
print('Data sent. Waiting for classification...')
y_answer = sock.recv()
print('Done.')

И на стороне сервера:

# ZeroMQ Context
context = zmq.Context()

# Setting up protocol (server)
sock = context.socket(zmq.REP)

ip = '127.0.0.1'
port = '1234'

sock.connect('tcp://'+ip+':'+port)
print('Listening to tcp://'+ip+':'+port+'...')

X_message = sock.recv()
X_test = pickle.loads(X_message)
sock.send(pickle.dumps(X_message))
y_message = sock.recv()
y_test = pickle.loads(y_message)
print('Data received. Starting classification...')

# Classification process

sock.send(pickle.dumps(y_message))
print('Done.')
Другие вопросы по тегам