2011-09-21 100 views
3

我正在使用RMI 2個連接,一個從客戶機到服務器,並且onether用於在客戶機上2個虛擬機之間的通信的程序。RMI與多個主機

看來RMI註冊表必須在服務器上運行(否則我得到java.rmi.AccessException: Registry.Registry.rebind disallowed; origin <client ip> is non-local host)。另外,如果沒有先撥打System.setProperty("java.rmi.server.hostname", <server ip>);,客戶端將無法連接到服務器。

所以,我試圖創建服務器端和客戶端上的註冊表。從客戶端上的一個虛擬機到另一個虛擬機的通信是使用在客戶端上創建的第二個註冊表完成的。這第二個註冊表創建時沒有投訴。但是,因爲我之前已經設置了java.rmi.server.hostname屬性,所以我得到另一個例外:java.rmi.ConnectException: Connection refused to host: <server ip>

我有一個適當的骯髒的解決方案;在每一個Registry.rebind()客戶端註冊表代替,我叫

System.setProperty("java.rmi.server.hostname", "localhost"); 
Registry registry = LocateRegistry. 
Remote stub = (Remote) UnicastRemoteObject.exportObject(remote, 0); 
registry.rebind(name, stub); 
System.setProperty("java.rmi.server.hostname", <server ip>); 

有沒有更好的方式來處理這個問題呢?可以創建和使用兩個註冊表,還是客戶端和服務器共享註冊表?

+0

爲什麼在exportObject中使用0作爲端口?創建註冊表時以及導出對象時使用兩個不同的端口,你應該很好。 –

回答

1

因爲主機名定義爲本地綁定註冊表對象的應用程序的主機名,您不必作家System.setProperty("java.rmi.server.hostname", <server ip>);客戶端。在這裏看到:java.rmi Properties

你甚至都不需要在不同的端口上運行註冊表。只是儘量保持簡單。如果有什麼不清楚的地方,你可以再問一次。