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.')