Python 数据\u arr=pickle.load(数据)EOFError:输入用完

Python 数据\u arr=pickle.load(数据)EOFError:输入用完,python,arrays,sockets,pickle,send,Python,Arrays,Sockets,Pickle,Send,当我的服务器收到pickle.dumps数据并加载它时,pickle.loads(数据)会生成以下错误 data\u arr=pickle.load(数据) EOR:输入超时 import socket import pickle HOST = 'localhost' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) conn, addr = s

当我的服务器收到pickle.dumps数据并加载它时,pickle.loads(数据)会生成以下错误

data\u arr=pickle.load(数据) EOR:输入超时

import socket
import pickle

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print ('Connected by', addr)
while 1:
    data = conn.recv(4096)
    data_arr = pickle.loads(data)
    if not data: break
    conn.send(data)
conn.close()

第一次调用
.recv(4096)
显然没有收到整个pickle。您需要累积数据,并且只有在完成整个操作后才对其调用
.loads()
。添加到上面的注释中。如果您使用的是streams,则没有简单的方法来区分一条消息的结束和另一条消息的开始。您可以在消息之间添加某种分隔符,或者在对象大小(以字节为单位)的头中添加分隔符。根据情况,您可以考虑使用像ZMQ这样的消息传递框架。