如何将Oracle VirtualBox的RMI客户端与W8主机的RMI服务器连接?

时间:2013-11-23 16:10:31

标签: java rmi virtualbox connection-timeout windows-firewall

我有一台带有Oracle VirtualBox的W8机器。在这里,我有一台ubuntu机器只与主机网络连接。

  

VirtualBox仅限主机以太网适配器

     

英特尔PRO / 1000 MT桌面(82540EM)

     

全部允许

在主机上我有一个类似于RMI服务器的java程序。

在虚拟机上,我的java程序就像一个RMI客户端。

客户端成功获取注册表没有任何问题,然后它在查找存根时挂起。因此我有:

SEVERE: java.rmi.ConnectException: Connection refused to host: 192.bla.bla.bla; nested exception is:
        java.net.ConnectException: Connection timed out
        at ...

RMIclient和RMIserver都拥有所有权限,这是RMI连接的代码:

服务器端:

private static void startServer() {
    System.setProperty("java.rmi.server.hostname", "192.bla.bla.bla");

    if (System.getSecurityManager() == null) {
        System.setProperty("java.security.policy", POLICY_FILE_LOC); //all permissions
        System.setSecurityManager(new SecurityManager());
    }
    try {
        String name = "RemoteController";
        RemoteControllerInterface remote = new RemoteController();
        RemoteControllerInterface stub =
            (RemoteControllerInterface) UnicastRemoteObject.exportObject(remote, 0);
        Registry registry = LocateRegistry.createRegistry(1099);
        registry.rebind(name, stub);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
    }       
}

客户端:

    RemoteControllerInterface remote = null;

    if (System.getSecurityManager() == null) {
        System.setProperty("java.security.policy", POLICY_FILE_LOC); //all permissions
        System.setSecurityManager(new SecurityManager());
    }

    try {
        String name = "RemoteController";
        Registry registry = LocateRegistry.getRegistry("192.bla.bla.bla");
        remote  = (RemoteControllerInterface) registry.lookup(name); // stuck here
        remote.connect(); // sample remote method
    } catch (Exception e) {
        e.printStackTrace();
    }

我使用在主机上运行它的相同客户端代码,一切正常,这就是为什么我认为VirtualBox的配置可能存在一些问题。

1 个答案:

答案 0 :(得分:0)

我不知道Windows防火墙所以这些是一般准则:

您不仅需要在Windows上为RMI注册表打开端口1099,还需要为您的服务器RMI对象本身打开另一个端口 - 我认为它会打开一个随机端口,不幸的是(请参阅其他StackOverflow问题) 。此外,您可能还需要允许VirtualBox仅主机网络与localhost通信(是的,我知道这是仅主机网络的整点,我只是说)。 / p>

但是您不需要允许任何其他计算机访问您的Java程序(对吗?),因此您可以允许从VirtualBox仅限主机的网络进行不受限制的访问,如果Windows防火墙允许您配置它来执行该操作。