【问题标题】:EOF when using cpickle to serialize an object使用 cpickle 序列化对象时的 EOF
【发布时间】:2012-12-05 10:19:41
【问题描述】:

我有以下报价,似乎工作正常:

from cPickle import *
class Clientthread(threading.Thread):
   def __init__(self,clientsocket, mystring):
      self.client = clientsocket
      self.clients = [clientsocket]
      self.testEntity = entity.Entity(position = [1,7])
      self.testTosend = dumps(self.testEntity,2)
      self.client.send(self.testTosend)

但是,当我尝试反序列化整个内容时

 news=self.s.recv(1024)
 realnews = loads(news)

我在使用负载的行中收到 EOF 错误。 知道这可能来自哪里吗?

【问题讨论】:

    标签: python pickle


    【解决方案1】:

    假设self.ssocketrecv 方法并不总是返回您请求的确切字节数。正如socket 文档中所述,数量是recv 要返回的最大字节数。

    这会导致将不完整的数据传递给您的loads

    【讨论】:

    • 哦。这说明了很多。
    • 知道如何找出我的对象有多少字节吗?如果它应该很大,是否有另一种方法来接收所有字节?是的,s 当然是一个套接字。
    • 您需要设置某种协议以通过套接字发送内容。最简单的方法是发送每个 data 块,其前面的大小以字节为单位。这样一来,接收端就总能知道预期和读取多少字节。
    • 好吧,我确实检查了——实际上我发送了 191 个字节——所以对象不可能太大。还有其他可能导致该错误的原因吗?
    • 或者,换句话说,接收端可能收到4096字节,但我只发送191。可能是什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2021-12-08
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多