2015-10-05 124 views
1

我寫了一個RMI客戶機/服務器程序在服務器簡單地從文件中讀取性能,並給它的客戶。服務器和客戶端程序都駐留在我的機器上。服務器示例代碼公網IP連接在RMI

public class DirectoryStructure { 

@SuppressWarnings("deprecation") 
public static void main(String[] args) { 
    System.setProperty("java.rmi.server.hostname", "local ip"); 
    System.setSecurityManager(new RMISecurityManager()); 
    DirectoryOperations directoryOperations; 
    try { 
     directoryOperations = new DirectoryOperations(); 

     Naming.rebind("rmi://local ip/ABC", directoryOperations); 

     directoryOperations.addAddess("name", 
       "addeess"); 
     System.out.println("Directory Server is ready."); 
    } catch (RemoteException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

正如你可以重新綁定方法看,當我把我的本地IP我能夠開始successfully.When我與我的機器的公共IP替換這個本地IP服務器我不能夠連接我得到java.net.ConnectException: Connection refused: connect。任何人都可以建議如何啓動服務器使用公共IP?

回答

0

這只是意味着你還沒有轉發必要的端口(1099)從你的公網IP路由器在局域網內的主機RMI。

如果你希望客戶端通過公共IP地址連接,您還應該設置java.rmi.server.hostname的公網IP地址。

但在Naming.bind()/rebind()/unbind()調用中使用除"localhost"以外的任何IP地址沒有任何意義,因爲您爲此目的而交談的註冊表必須在本地主機上運行。只有客戶端使用公共IP地址纔有意義。

0

添加到@EJP,

,你應該調用註冊代碼(Naming.rebind())在服務器本地主機與上。

訪問遠程對象,請使用Naming.lookup(),這是你的客戶端試圖訪問訪問RMI服務器(無論是本地/互聯網)

如果使用公網IP的擡頭,請求將您的網關(路由器)去inturn到服務器的的accessPoint,(它的路由器,這是處理輸入公共請求)。正如EJP提到的,路由器應該將該請求路由到正確的機器。