scala中是否有一种方法可以使用RemoteActor在远程节点上执行任意代码?

时间:2010-11-12 02:23:48

标签: scala scala-2.8

例如,我有一个受信任的客户端和一台服务器。客户端想要在服务器上执行任意代码。可以使用RemoteActor实现这一点(序列化一个函数并通过网络发送,反序列化并执行它)?

2 个答案:

答案 0 :(得分:4)

以下是 example 使用 URLClassLoader 与远程actor,通过http从客户端获取类并执行generic服务器上的计算。

您可能还对应用于序列化HotSwap techniqueAkka Actors感兴趣。

答案 1 :(得分:3)

目前不是。序列化函数意味着将其字段存储到对象输出流中并对其进行反序列化意味着从其他位置的对象输入流中读取函数对象。反序列化假定从对象输入流中读取的对象的类是JVM已知的。记住 - 函数只是场景背后的对象。

在这种情况下,服务器不知道您正在序列化的函数对象的实际具体类,可能它实现了Function接口。要支持此类功能,您必须找到相关功能的类文件,将其发送到服务器,然后使用自定义classloader将其加载到服务器上。然后,如果对象具有任何类型的状态,您可以序列化客户端上的对象,通过网络发送它并在服务器上反序列化它。只有这样你才能运行它的方法。假设您的函数对象是无状态的(通常是这种情况),您可以跳过序列化/反序列化步骤。

编辑:

另外,请记住,函数可以在内部保存对其调用环境的引用。这意味着您可能最终将函数对象的环境与其一起序列化,这可能是您的整个程序数据。