簡體   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