我想了解Oracle的RMI Java教程,並且我有一些問題。爲了參考的教程此處鏈接:Java RMI - 瞭解Oracle教程
- 服務器代碼:http://docs.oracle.com/javase/tutorial/rmi/implementing.html
- 客戶端代碼:http://docs.oracle.com/javase/tutorial/rmi/client.html
1)在服務器的例子,主要功能的最後一行是:System.out.println("ComputeEngine bound");
。正常執行會說在這一點上,主函數退出並且程序終止。但是,有些東西正在導致程序被阻止。有沒有人知道爲什麼當你運行服務器時程序阻塞(而不是在打印計算引擎綁定後退出)?
2)關於上一個問題,似乎服務器阻塞並在端口上偵聽。它在監聽什麼端口? RMIRegistry如何知道服務器正在監聽的端口?
3)我的另一個問題是,當客戶端獲取從RMIREGISTRY存根(使用registry.lookup
),然後在這個存根調用executeTask
,並計算髮生運行rmiregistry中,或運行服務器代碼的機器在機器上?即存根告訴RMIRegistry在位於註冊表中或服務器的main
函數中的computeEngine
實例上運行executeTask
?
謝謝!這很有幫助。 – user1413793 2014-10-02 21:07:52
要補充說明:「RMIRegistry如何知道服務器正在偵聽的端口?」它嵌入在存根中。但它只需要知道DGC的用途,這是由RMI運行時系統在註冊表JVM中執行的。註冊管理機構根本不需要知道端口。 – EJP 2014-10-02 22:08:19
它指定您指定的任何端口,如果不指定則指定爲零。 OS提供隨機端口本身,而不僅僅是範圍。 – EJP 2016-02-28 00:06:10