简体   繁体   中英

Java RMI client and remote server Connection Refused to localhost

I am not so experienced in Java RMI. I am trying to implement simple RMI communication, but faced with the problem.

Here my RMI client

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();
        }
    }

}

Communication inerface

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

My server

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();
    }

}

And rmi.policy

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

So I have started rmiregistry on my server rmiregistry 1099 . And everything works well until calling remote object method.

Here are my steps

Lets consider that my domain is mydomain.net , I host it on my server at home with static IP.

  1. Run rmiregistry on the server
  2. Run server application on the server
  3. Run client application on any PC
  4. Click button to invoke remote method

So it seems that everything connects and binds successfully, because if force enter invalid domain, endpoint or refused if rmiregistry is not started - java.rmi.ConnectException is thrown.

But when I try to invoke any method on remote object, BTW which has been already retrieved successfully it throws a 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)

As I can understand the problem is that it (server) forces me to connect to my localhost instead of remote.

PS on localhost everything works perfectly (both client and server on the one PC)

Please help to solve this problem.

EDIT

I have forgotten to tell that I have tried to set property of java.rmi.server.hostname , in this case it takes a lot of time to start the server and ends with exception.

Leaving the 127.0.0.1 issue aside, which is solved by java.rmi.server.hostname , your problem now is connect timeouts. This will be caused by your firewall. You need to export your remote object on a specific port, and you need to open that TCP port in your firewall.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM