2014-10-02 48 views
0

我想了解Oracle的RMI Java教程,並且我有一些問題。爲了參考的教程此處鏈接:Java RMI - 瞭解Oracle教程

1)在服務器的例子,主要功能的最後一行是:System.out.println("ComputeEngine bound");。正常執行會說在這一點上,主函數退出並且程序終止。但是,有些東西正在導致程序被阻止。有沒有人知道爲什麼當你運行服務器時程序阻塞(而不是在打印計算引擎綁定後退出)?

2)關於上一個問題,似乎服務器阻塞並在端口上偵聽。它在監聽什麼端口? RMIRegistry如何知道服務器正在監聽的端口?

3)我的另一個問題是,當客戶端獲取從RMIREGISTRY存根(使用registry.lookup),然後在這個存根調用executeTask,並計算髮生運行rmiregistry中,或運行服務器代碼的機器在機器上?即存根告訴RMIRegistry在位於註冊表中或服務器的main函數中的computeEngine實例上運行executeTask

回答

2

RMI創建後臺監聽線程。程序不會終止,直到線程死亡。

它將0指定爲端口,這意味着它使用OS定義範圍的隨機端口。

存根封裝了TCP/IP調用以通知服務器調用該方法。因此,實際的實現在託管代碼的服務器上運行。如果您在服務器代碼上放置println,則在調用該函數時會看到它打印出來。

+0

謝謝!這很有幫助。 – user1413793 2014-10-02 21:07:52

+1

要補充說明:「RMIRegistry如何知道服務器正在偵聽的端口?」它嵌入在存根中。但它只需要知道DGC的用途,這是由RMI運行時系統在註冊表JVM中執行的。註冊管理機構根本不需要知道端口。 – EJP 2014-10-02 22:08:19

+0

它指定您指定的任何端口,如果不指定則指定爲零。 OS提供隨機端口本身,而不僅僅是範圍。 – EJP 2016-02-28 00:06:10

0
  1. RMI爲它正在監聽的每個端口創建一個接受線程。那些線程只有在相應端口上導出的所有遠程對象未明確或未通過DGC導出時纔會退出。
  2. 它正在監聽您在構建或導出遠程對象時指定的任何端口,或者在系統分配的端口(如果未指定一個或指定零)時監聽。註冊管理機構不知道端口是什麼,但存根。
  3. 計算髮生在遠程對象從其導出的主機上,但通常與註冊表是相同的主機,因爲將遠程對象綁定到不同主機中的註冊表是困難的(但並非不可能)。