我知道有些類似的問題已經回答了這個問題,但是我已經閱讀過這些內容,但我仍然遇到麻煩。調試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協同工作?
任何幫助真的很感激。
嗨,謝謝你。所以我把它設置爲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
是您的公開IP地址217.137.xxx.xxx?你是否在端口1099上導出遠程對象?你在lookup()上得到異常嗎?或執行遠程方法時? – EJP
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