2013-10-24 27 views
1

沒有任何Java RMI的經驗,我有一個天真的問題,但在搜索互聯網後我仍然不確定答案。使用Java RMI時執行的代碼在哪裏?

問:

對我來說,有兩種情況:

方案-1:從本地啓動一個Java程序,在執行過程中,它調用存儲在從類中的方法一個遠程機器,那麼該方法的類將被下載到本地機器,並繼續執行。

場景-2:從本地啓動Java程序,在其執行過程中,它調用遠程機器上存儲的類中的方法,然後該方法將在遠程機器上執行,結果將爲發回本地機器。 (這是否需要類/對象傳輸?

哪一個Java RMI使用?或兩者都不?

Wikipedia of RPC:「RPC允許計算機程序在另一個地址空間(通常在共享網絡上的另一臺計算機上)執行子例程或過程」,看起來這是第二種情況。

但根據這篇論文Reducing Data Transfer during Remote Classloading in Java RMI,它似乎是第一種情況。

+0

鏈接文件的哪部分讓你認爲它是情景#2? –

+0

@StephenC連接的文件讓我覺得它是場景#1,因爲它提到遠程類加載(對我來說,加載遠程類到本地)。 – JackWM

+1

遠程類加載並不意味着這一點。它意味着從遠離代碼運行位置的位置加載類(代碼)。代碼移動到RMI目標對象...反之亦然。 –

回答

0

該方法將在遠程機器上執行。爲此,本地機器下載一個包裝本地機器和遠程機器之間通信的類。

+0

這是否需要動態類加載? – JackWM

+0

@JackWM或者將相關的所有類都部署到服務器和客戶端。 – EJP

1

使用RMI時,基本上有一個在客戶端和服務器之間共享的接口。服務器必須有一個實現,客戶端不應該有這個實現。因此,沒有類加載或任何類型的客戶端到服務器邏輯傳輸,客戶端完全不知道服務器接口實現。

RMI序列化並傳輸方法參數,然後服務器邏輯正在執行,結果被序列化並傳輸回客戶端。

+0

謝謝安德烈。所以它確實傳輸對象,對吧?全局變量/類成員如何? – JackWM

+0

遠程方法調用的參數必須是'Serializable'和[對服務器和客戶端都可見](http://stackoverflow.com/questions/11736347/how-to-pass-object-in-arguments-in-rmi-方法)。 –

+1

這個想法與'打包我的參數,傳輸,執行方法,打包結果並將其傳回'一樣簡單。 –