【问题标题】:Sending Executable Java over a Socket通过套接字发送可执行 Java
【发布时间】:2015-05-25 13:29:41
【问题描述】:

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

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

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 实例化子类,定义 run 方法并使用内置的 ObjectOutputStreamObjectInputStream 将派生类从节点 A 发送到节点 B,并且只需让节点 B 调用收到作业时的run()方法。

然而,这超出了通过ObjectOutputStream 发送的序列化对象所能完成的工作,因为节点 B 需要从节点 A 发送的类的确切定义 - 因为每个作业都将属于它,所以它不能拥有不同的子类型,并且对 run() 方法有不同的定义。

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

我知道我可能只需要创建 .jars 并通过 OutputStream 发送它们,然后让 Node B 执行它们。但是,如果有什么方法可以让我拥有一个可以扩展和实例化的基本 Job 类来定义不同类型的 Job 并将这些 Job 发送到 Node B?

任何帮助或建议将不胜感激!!提前致谢! :)

【问题讨论】:

    标签: java sockets distributed-computing objectoutputstream


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为你是对的 - 这是不可能的。如果使用对象输出流,具体类的name 是转移操作的一部分;所以你需要另一边的类定义(因为 JVM 会想要为你传输的对象加载 .class 文件)。所以.class文件需要两边都存在。

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

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

      【讨论】:

      • 是的,这也是我的想法,它稍微偏离了我想要实现的目标,但我似乎找不到任何其他方法来做到这一点......谢谢你的帮助!
      【解决方案3】:

      要补充 EJP 的答案,您需要一个动态网络类加载工具,它必须能够获取不在应用程序本地类路径中的类的字节码。

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

      我还知道两个开源网格计算框架,它们为 API 用户隐式和透明地提供这种设施:JPPFGridGain

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

      【讨论】:

      • 答案中的codebase链接实际上指向java.util.List的javadoc,可能是codebase
      • 是的,感谢您接受这个!链接现已修复
      猜你喜欢
      • 2014-01-11
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2021-06-09
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多