Pyro4,接收:数据不足

Pyro4, receiving: not enough data

我正在尝试 运行 使用 Pyro4 在服务器上实现一个功能。 看看代码: ==========================客户端======================

import Pyro4
def square(x): 
    return x**2
remoteServer = Pyro4.Proxy('PYRONAME:server')
print(remoteServer.evaluate(square, 4))

===========================服务器================= =========

import Pyro4
class Server(object):
    def evaluate(self, func, args):
        return func(*args)

def main():
    server = Server()
    Pyro4.Daemon.serveSimple({server: "server"},ns=True)

if __name__ == '__main__':
    main()

========================命名服务器=================== =====

import Pyro4
Pyro4.naming.startNSloop()

============================================= ==============

并出现错误:“Pyro4.errors.ConnectionClosedError:接收:数据不足”。查看下面的完整堆栈跟踪:

    Traceback (most recent call last):
  File "C:\Users\Alex\Desktop.py", line 9, in <module>
    print(remoteServer.evaluate(square, 4))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 169, in __call__
    return self.__send(self.__name, args, kwargs)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 380, in _pyroInvoke
    msg = message.Message.recv(self._pyroConnection, [message.MSG_RESULT], hmac_key=self._pyroHmacKey)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\message.py", line 161, in recv
    msg = cls.from_header(connection.recv(cls.header_size))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 460, in recv
    return receiveData(self.sock, size)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 195, in receiveData
    raise err
Pyro4.errors.ConnectionClosedError: receiving: not enough data

我希望服务器执行传递给方法(函数)的函数。

PS: Windows7, Python 3.4.1

我发现了类似的问题 (How to send a function to a remote Pyro object),但对我没有用。 尝试使用回调装饰器@pyro4.callback,但即使是官方示例 (https://github.com/delmic/Pyro4/tree/master/examples/callback : server2.py, client2.py) 也不起作用(使用 python 3.4 和 python 2.7) => 仅显示消息:"server: doing callback 1 to client",但没有任何反应。


谢谢

您链接到的 github 存储库不是官方存储库。这是一个克隆(来自相当旧的版本)。这是官方回购:https://github.com/irmen/Pyro4

关于您的问题:无法序列化函数并通过网络发送它们。如果你告诉 Pyro 使用 pickle 作为序列化协议,你可以做更多的技巧,但 pickle 仍然需要在连接的两端都有可用的模块源或字节码。

您的客户端崩溃的原因是由于 Pyro 协议错误导致服务器中止连接。如果启用日志记录,它将显示在服务器的日志文件中,类似于:"Pyro4.errors.ProtocolError: unsupported serialized class: builtins.function".

还有一个提示:您不必使用单独的源代码文件来启动名称服务器。您可以直接从命令行启动它。

最后,@pyro4.callback 装饰器无关,请阅读 http://pythonhosted.org/Pyro4/clientcode.html?highlight=callback#pyro-callbacks 了解它的用途。它影响 Pyro 处理异常的方式,仅此而已。

编辑:请注意,自 Pyro 4.35 起,此错误将被正确地报告回客户端,并且不再会中止连接。