2015-10-05 62 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提到的,路由器应该将该请求路由到正确的机器。