Arrays Python3 TypeError:序列项0:应为类似字节的对象,找到int

Arrays Python3 TypeError:序列项0:应为类似字节的对象,找到int,arrays,python-3.x,python-sockets,Arrays,Python 3.x,Python Sockets,我正在尝试通过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

我正在尝试通过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.')

服务器示例代码中似乎缺少一些内容:您使用了
数据
,但是
数据
从未被分配。只需使用
test\u data=pickle.load(data\u pack)
并删除
连接
行:
数据包
已经是字节对象,而不是列表。您可以使用
+=
附加到字节字符串,就像您在这里所做的那样。