2011-01-26 156 views
4

如果我想啓用「雙向」溝通在我的RMI應用程序(即,允許服務器調用客戶端上的方法,以及客戶端調用服務器上的方法)是使客戶端成爲Remote類的最簡單方法嗎?的Java RMI - 使客戶端服務器

另外,如果我打算給我的客戶的情況下,傳遞到服務器作爲方法的參數,我是正確的思維,沒有必要添加了「客戶端類」到rmiregistry?

而最後一個問題,做我的課還需要在同一個地方進行編譯? I.E我可以在兩個完全獨立的機器上編譯服務器和客戶機,並期望它們能正確通信嗎?

*編輯**

還有一個問題,我的問題提到了我的客戶端界面(IClient):它有一個ArrayList(所以我必須ArrayList<IClient>)存儲客戶端的新實例,使服務器可以跟蹤註冊客戶。當我嘗試在另一臺機器上編譯服務器時,它抱怨它無法找到IClient - 顯然,IClient位於客戶機上。我如何解決這個問題?

回答

3

你對所有的假設都是正確的。

您不必你可遠程調用客戶端類添加到RMI註冊表,但你還是要出口。

與彙編唯一需要注意的是,它們必須具有相同版本的Java使用相同的編譯器設置(至少那些影響RMI存根代)來完成。

+0

你不應該使用rmi存根,他們已經不需要多年了。並且在大多數情況下,jdk 5和6將在RMI上進行通信(在jdk 6的一個發佈版本中存在一些問題,但它們是固定的)。 – jtahlborn 2011-01-26 21:44:11

+0

@jtahlborn感謝您的糾正,我最後一次使用RMI的確是低於1。4,但重點只是以類似的方式編譯它們。 – biziclop 2011-01-26 21:51:21

3

如果你有一個客戶端或服務器將在未來部署在防火牆後面的任何要求,從RMI望而卻步。你在問問題。 特別是如果你想讓服務器調用客戶端。

這裏有兩個備選解決方案爲我們運作良好:

  • 在客戶端調用與服務器阻塞調用服務器,直到數據可用於客戶端。這會爲每個客戶端使用一個線程(如果您不使用NIO),但很容易實現。 在一段時間返回NULL一次,以防止來自客戶端的長時間運行的調用防火牆被關閉(取決於防火牆的配置,當然)

  • ,如果你想很好的Java接口一起玩,考慮Hessian這是非常輕量級的,運行在HTTP之上,並且不會打擾RMI註冊表或類似的東西

  • 如果您打算將服務器端打開到其他客戶端,Hessian仍然是一個不錯的選擇,但如果縮放out是一個問題,看看RESTful架構風格。

0

回覆您的最後一個問題,遠程接口類,他們依賴於等遞歸直到關閉所有的類都必須存在兩個主機上。