Python cPickle.UnpicklingError:pickle数据被截断

Python cPickle.UnpicklingError:pickle数据被截断,python,sockets,django-models,rpc,pickle,Python,Sockets,Django Models,Rpc,Pickle,我使用远程过程调用在两个prozes之间进行通信。我将对象从手头发送到另一个。该对象是django模型的对象。对象具有不同的变量、整数和字符串 如果我只更改整数变量,一切都正常。如果我第一次更改字符串变量,它也可以工作,但是如果我第二次更改字符串,我的代码崩溃,我会得到以下错误消息 Traceback (most recent call last): File "/home/manch011/disserver/src/disserver/gui/backends/receiver.py",

我使用远程过程调用在两个prozes之间进行通信。我将对象从手头发送到另一个。该对象是django模型的对象。对象具有不同的变量、整数和字符串

如果我只更改整数变量,一切都正常。如果我第一次更改字符串变量,它也可以工作,但是如果我第二次更改字符串,我的代码崩溃,我会得到以下错误消息

Traceback (most recent call last):
  File "/home/manch011/disserver/src/disserver/gui/backends/receiver.py", line 69, in run
    name, args, kwargs = cPickle.load(connFile)
cPickle.UnpicklingError: pickle data was truncated
这是我的密码, 在服务器端:

_exportedMethods = {
    'changes': signal_when_changes,
}  

class ServerThread(QtCore.QThread):

    def __init__(self):
        super(ServerThread,self).__init__()
        st = self
    #threading.Thread.__init__(self)
    def run(self):
        HOST = ''     # local host
        PORT = 50000
        SERVER_ADDRESS = HOST, PORT

        # set up server socket
        s = socket.socket()
        s.bind(SERVER_ADDRESS)
        s.listen(5)

        while True:
            conn, addr = s.accept()
            connFile = conn.makefile()
            name, args, kwargs = cPickle.load(connFile)
            res = _exportedMethods[name](*args,**kwargs)
            cPickle.dump(res,connFile) ; connFile.flush()
            conn.close()
这是客户端:

class RemoteFunction(object):
def __init__(self,serverAddress,name):
    self.serverAddress = serverAddress
    self.name = name
def __call__(self,*args,**kwargs):
    s = socket.socket()
    s.connect(self.serverAddress)
    f = s.makefile()
    cPickle.dump((self.name,args,kwargs), f) 
    f.flush()
    res = cPickle.load(f)
    s.close()
    return res

def machine_changed_signal(machine):
    HOST = ''
    PORT = 50000
    SERVER_ADDRESS = HOST, PORT
    advise = RemoteFunction(SERVER_ADDRESS,'changes')
    advise(machine)
我不熟悉cPickle,因此无法理解这一点,有人能给我解释一下吗


提前谢谢Chis,我解决了自己的问题。但首先,我在问题中描述的错误信息没有意义

我是新解决的问题,并使用了Pyro4框架。因此,我得到了一个新的错误消息,它与旧的错误消息相同,但很清楚。你不能pickle类对象。 因为我只需要属性值​​我把它放在一本简单的字典里

首先下载并安装它 一个与上的示例类似的简单示例:

运行此程序,然后执行下一个

# saved as client.py
import Pyro4
name=raw_input("What is your name? ").strip()
helloworld=Pyro4.Proxy("PYRONAME:example.helloworld")    # use name server object lookup uri shortcut
print helloworld.get_hello_world(name)

重要信息:不能传输类实例。所以“name”不能是类实例。

您可以添加一些代码,或者添加一个如何解决问题的示例吗?如果链接断开或消失,这篇文章中没有任何信息可以帮助未来的观众。是的,这就是我想要的——我个人不需要它,但其他人可能需要,这会更有帮助。谢谢你这么快就发布了。:)
# saved as client.py
import Pyro4
name=raw_input("What is your name? ").strip()
helloworld=Pyro4.Proxy("PYRONAME:example.helloworld")    # use name server object lookup uri shortcut
print helloworld.get_hello_world(name)