通过套接字发送可执行Java

时间:2015-03-22 14:04:24

标签: java sockets distributed-computing objectoutputstream

我正在研究Java中的网络项目,我希望将一些可执行代码从Node A发送到Node B,并让Node B将执行代码的结果返回给Node 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将派生类从Node A发送到Node B,并且只需要节点B在收到作业时调用run()方法。

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

有没有人知道其他任何方法吗?一种从节点A向节点B发送可执行代码并让节点B执行代码的方法?

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

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

3 个答案:

答案 0 :(得分:2)

我认为你是对的 - 这是不可能的。如果使用对象输出流,则具体类的名称是已传输操作的一部分;所以你需要另一方面的类定义(因为JVM需要加载你传输的对象的.class文件)。所以.class文件需要存在于双方。

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

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

答案 1 :(得分:2)

您可以通过RMI和代码库功能完成此操作。

答案 2 :(得分:2)

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

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

我也知道两个开源网格计算框架,它们为API用户提供了隐含和透明的这种工具:JPPFGridGain

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