2014-07-09 96 views
0

我知道有些類似的問題已經回答了這個問題,但是我已經閱讀過這些內容,但我仍然遇到麻煩。調試RMI連接

我有一臺服務器和一臺使用RMI的客戶端互相連接。客戶在大學,服務器在家。這樣做是因爲我可以完全控制家中的任何防火牆,但不是在大學,我覺得這會給我最好的工作機會。

我在同一臺機器上使用「localhost」測試了它們,這很好(包括home和uni)。然後,我將服務器移動到運行Windows Server 2012的主機上的VM上。我可以遠程桌面到該VM,因爲它被設置爲橋接連接並設置了端口轉發。我也轉發端口1099的服務器有權在主本的頂部:

System.setProperty("java.rmi.server.hostname", "localhost"); 
setRegistry(LocateRegistry.createRegistry(1099)); 
System.setSecurityManager(new RMISecurityManager()); 
Naming.rebind("rmi://localhost/" + AUTH_OBJECT_BINDING, server); 

安全管理器使用其中有一個security.policy檔案,現在:

grant { 
     permission java.security.AllPermission; 
}; 

當我嘗試我的客戶端連接到服務器,有取代「本地主機」的命名查找與我家IP在客戶端,並通過防火牆已經允許Java和設置端口轉發,我得到這個:

java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is: 
    java.net.ConnectException: Connection timed out: connect 

其中xxx.xxx.xxx.xxx是我正確的主IP地址。

因此,爲了測試問題出在哪裏,我在服務器虛擬機上運行客戶端,但不是使用本地主機,而是使用我的外部IP。這連接和工作。因此,因爲我可以連接使用我的外部IP(從217.137 ...開始),我認爲服務器正在接受連接。

我認爲這意味着來自大學的出站連接存在問題。這是唯一的問題嗎?我想排除一切。不幸的是,我無法訪問另一個不在家或者不是的網絡,但是使用我在家裏的外部IP進行測試應該是一樣的。

如果是這樣,我可以在我的家用機器上建立一個SSH服務器,我知道這個服務器可以在大學內使用,也許可以使用膩子和隧道,任何指導,或者甚至可能真的有幫助。

只是要清楚,我的問題分爲兩部分: 1)它可能是在大學阻止我連接到我的服務器的出站規則。 2)如果是這樣,我該如何設置好與RMI協同工作?

任何幫助真的很感激。

回答

1
System.setProperty("java.rmi.server.hostname", "localhost"); 

這絕對不行。它需要設置爲服務器的公用IP或主機名,通過它可以通過Internet訪問它。

什麼你所做的是強迫每到包含的「localhost」作爲它的目標地址的存根,如果客戶端在同一個本地主機作爲服務器,這將正常工作,而不是其他。它需要是客戶端可以用來連接到服務器的東西。

您還需要在通常情況下通過超級(1099)在端口1099上導出遠程對象,這又意味着您必須通過LocateRegistry.createRegistry()運行註冊表,確保存儲結果在一個靜態變量,所以它不會被垃圾收集。

+0

嗨,謝謝你。所以我把它設置爲217.137.xxx.xxx(我的IP)。 \t \t \t System.setProperty(「java.rmi.server.hostname」,「217.137.xxx.xxx」); 這是有道理的。 在我的Naming.rebind上,我仍然使用它(因爲它需要是本地主機): Naming.rebind(「rmi:// localhost /」+ AUTH_OBJECT_BINDING,server); 現在,當我嘗試使用localhost或我的外部IP從我的客戶端(現在基於相同的VM)進行連接時,我得到連接拒絕異常。 – ThePerson

+1

是您的公開IP地址217.137.xxx.xxx?你是否在端口1099上導出遠程對象?你在lookup()上得到異常嗎?或執行遠程方法時? – EJP

+0

217.137.xxx.xxx是我的公開地址。我知道這是正確的,因爲我目前正在將它用於遠程桌面,並且它工作正常(我現在在uni)。當我使用loopup時,我沒有得到異常,但是當我調用返回的第一個方法時,我得到它。例如,我的客戶機具有: authObject =(InterfaceAuth)Naming.lookup( 「RMI://217.137.xxx.xxx/」 + AUTH_OBJECT_BINDING) 然後 會話= authObject.Authenticate( 「用戶」, 「通」) ; 然後我從這行中得到異常,java.rmi.ConnectException:連接拒絕主機:217.137.xxx.xxx; – ThePerson

0

我手邊沒有任何特定的文檔,但據我所知RMI不適用於NAT。

我假設你仍然能夠從你的網絡內部連接到服務器,因爲你的路由器使用NAT環回。

+0

感謝您的評論。我的家用機器上的虛擬機使用直接(橋接)連接,所以我認爲它應該沒問題?或者我可能在這裏錯過了一些東西。 – ThePerson

+0

'RMI與NAT無法正常工作'是錯誤的。 – EJP

+0

@EJP就我所知,在NAT後面運行RMI服務器只有在java.rmi.server.hostname屬性設置爲解析爲私有內部IP的域名(不是IP)時才起作用NAT網絡內部以及面向公衆的網絡外的IP。 – rthur