Java RMI客户端和远程服务器连接拒绝到localhost

时间:2016-03-07 22:15:26

标签: java localhost rmi

我对Java RMI不太熟悉。我正在尝试实现简单的RMI通信,但遇到了问题。

这是我的RMI客户端

public class MainClientApplication {

    public static final String FILE_NAME_RMI_POLICY = "rmi.policy";
    public static final String RMI_DOMAIN = "mydomain.net";
    public static final String RMI_ENDPOINT = "/MD5Decrypter";
    public static final String PROTOCOL = "rmi://";

    public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir") + File.separator + FILE_NAME_RMI_POLICY);
        System.setProperty("java.security.policy", System.getProperty("user.dir") + File.separator + FILE_NAME_RMI_POLICY);
        String remoteHost = String.format("%s%s%s", PROTOCOL, RMI_DOMAIN, RMI_ENDPOINT);
        System.setSecurityManager(new SecurityManager());
        try {
            ComputeEngine computeEngine = (ComputeEngine) Naming.lookup(remoteHost);
            SwingUtilities.invokeLater(() -> new MainWindow("MD5 Decryption", computeEngine));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

沟通inerface

public interface ComputeEngine extends Remote {
    Object executeTask(Task t) throws RemoteException;
}

我的服务器

public class MainServer {
    public static final int PORT = 1099;
    public static final String RMI_ENDPOINT = "MD5Decrypter";
    public static final String FILE_NAME_RMI_POLICY = "rmi.policy";
    public static final String RMI_DOMAIN = "mydomain.net";
    public static final String PROTOCOL = "rmi://";

   public MainServer() {
    try {
        System.setProperty("java.security.policy", System.getProperty("user.dir") + File.separator + FILE_NAME_RMI_POLICY);
        //System.setProperty("java.rmi.server.hostname", RMI_IP);
        System.setProperty("java.rmi.server.hostname", RMI_DOMAIN);
        System.setSecurityManager(new SecurityManager());
        ComputeEngine computeEngine = new ComputeEngineExecutor();
        //  Naming.rebind(String.format("%s%s:%d/%s", PROTOCOL, RMI_DOMAIN, PORT, RMI_ENDPOINT), computeEngine);
        Naming.rebind(RMI_ENDPOINT, computeEngine);
        System.out.println("Successfully started RMI Server");
    } catch (RemoteException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

    public static void main(String[] args) {
        MainServer mainServer = new MainServer();
    }

}

rmi.policy

grant {
    permission java.net.SocketPermission "*:1024-65535", "connect, accept";
    permission java.io.FilePermission "-", "read";
    permission java.net.SocketPermission "*:80", "connect";
};

所以我在服务器rmiregistry 1099上启动了rmiregistry。一切都运行良好,直到调用远程对象方法。

以下是我的步骤

让我们考虑一下,我的域名是mydomain.net,我在家里的服务器上使用静态IP托管它。

  1. 在服务器上运行rmiregistry
  2. 在服务器上运行服务器应用程序
  3. 在任何PC上运行客户端应用程序
  4. 点击按钮调用远程方法
  5. 所以似乎所有东西都成功连接和绑定,因为如果强制进入无效域,端点或者如果rmiregistry没有启动则被拒绝 - java.rmi.ConnectException被抛出。

    但是当我尝试在远程对象上调用任何方法时,已经成功检索到的BTW会抛出java.rmi.ConnectException

    java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 
        java.net.ConnectException: Connection refused
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
        at com.sun.proxy.$Proxy0.executeTask(Unknown Source)
        at ui.MainWindow.lambda$initGui$0(MainWindow.java:49)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    

    我可以理解问题是它(服务器)强迫我连接到我的localhost而不是远程。

    在本地主机上的P.S一切正常(在一台PC上都是客户端和服务器)

    请帮助解决这个问题。

    修改

    我忘记告诉我已尝试设置java.rmi.server.hostname的属性,在这种情况下,启动服务器需要花费大量时间,并以异常结束。

1 个答案:

答案 0 :(得分:1)

抛开127.0.0.1问题,由java.rmi.server.hostname解决,现在你的问题是连接超时。这将由您的防火墙引起。您需要在特定端口上导出远程对象,并且需要在防火墙中打开该TCP端口。