繁体   English   中英

通过套接字发送可执行Java

[英]Sending Executable Java over a Socket

我正在使用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从Node A将派生类发送到Node B,并让Node B在收到时简单地调用run()方法一份工作。

但是,这超出了通过ObjectOutputStream发送作为对象B发送的序列化对象所无法完成的工作,因为它需要从节点A发送的类的确切定义-因为每个Job都具有不同的子类型,所以它不能具有该类的定义。将对run()方法有不同的定义。

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

我知道我可以只创建.jars并通过OutputStream发送它们,然后让Node B执行它们。 但是,如果有任何办法,我可以拥有一个基类Job类,可以对其进行扩展和实例化以定义不同类型的Jobs,并将这些Jobs发送到Node B,从而做到这一点?

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

我认为您是对的-这是不可能的。 如果使用对象输出流,则具体类的名称是已传输操作的一部分; 因此,您需要在另一侧定义类(因为JVM将要为传输的对象加载 .class文件)。 因此,.class文件必须同时存在于两侧。

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

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

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

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

是的,只要罐子的位置可以表示为URL,并且您具有服务于它的服务器基础结构(或URL处理程序),RMI Server的代码库功能就应该允许您这样做。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM