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

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

我正在尝试通过 TCP 从类服务器脚本向类客户端脚本发送一个数组。该数组是可变的,因此数据使用数据包发送,然后在客户端连接在一起。

我要发送的数据来自 MNIST 深度学习手写数字数据集。服务器端代码为:

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

我应该如何格式化连接以重新创建发送的数据并将其用于脚本的其余部分?

我最终使用 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.')