通过套接字发送可执行文件 Java

Sending Executable Java over a Socket

我正在 Java 进行一个网络项目,我想将一些可执行代码从节点 A 发送到节点 B,并让节点 B return 将执行代码的结果返回给节点 A.

我尝试这样做的方法(我现在知道这不适合我的用例)是定义一个名为 Job 的抽象 class,它有一个抽象方法 运行 ().它看起来像这样:

import java.io.Serializable;

public abstract class Job implements Serializable {

  public String id;

  public Job(String id) {
      this.id = id;
  }

  public abstract void run();

}

然后我计划从 Job 实例化子 classes,定义 运行 方法并使用内置的方法将派生的 class 从节点 A 发送到节点 B ObjectOutputStreamObjectInputStream 并让节点 B 在收到作业时调用 运行() 方法。

然而,这超出了通过 ObjectOutputStream 发送的序列化对象所能完成的范围,因为节点 B 需要从节点 A 发送的 class 的确切定义 - 它可以' t have 因为每个 Job 将具有不同的子类型,并且将具有不同的 运行() 方法定义。

有谁知道还有其他方法可以做到这一点吗?一种将可执行​​代码从节点 A 发送到节点 B 并让节点 B 执行代码的方法?

我知道我可能只创建 .jars 并通过 OutputStream 发送它们,然后让节点 B 执行它们。但是如果有任何方法我可以通过拥有一个基本作业 class 来做到这一点,我可以从中扩展和实例化以定义不同类型的作业并将这些作业发送到节点 B?

如有任何帮助或建议,我们将不胜感激!!提前致谢! :)

我认为你是对的——这是不可能的。如果使用对象输出流,具体 class 的 name 是传输操作的一部分;所以你需要另一边的 class 定义(因为 JVM 将要 load .class 文件用于你传输的对象。所以 .class 文件需要在两边都存在。

除了发送 .class 或 .jar 文件并使用反射来执行相应代码外,我没有看到任何其他选项。

编辑:但是使用反射...仍然允许您在节点 A 上构建不同的作业 classes。以有意义的方式组织您的 classes 仍然有意义;即使您必须先传输它们然后使用反射来调用它们。

您可以通过 RMI 和代码库功能完全做到这一点。

要添加到 EJP 的答案中,您需要的是动态网络 class 加载工具,它必须能够获取不在本地 [=23] 中的 classes 的字节码=]你的应用程序路径。

是的,RMI 服务器的 codebase 功能应该允许您这样做,前提是 jar 的位置可以表示为 URL 并且您有服务器基础结构(或 URL handler) 来服务它。

我还知道两个开源网格计算框架,它们为 API 用户隐式和透明地提供了这种功能:JPPF and GridGain

免责声明:我是 JPPF 的主要开发人员。