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 起,此错误将被正确地报告回客户端,并且不再会中止连接。
我正在尝试 运行 使用 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 起,此错误将被正确地报告回客户端,并且不再会中止连接。