Java Соединение вызова метода RMI отклонено с OpenVPN - PullRequest
0 голосов
/ 22 марта 2020

Гррр, я чувствую, что это должно быть настолько очевидно, но я не могу найти решение.

Для целей тестирования я создал простой клиент и сервер для приложения RMI. Я могу успешно запустить клиент и сервер по локальной сети. Я также могу успешно запустить приложение при подключении через встроенное VPN-соединение Windows 10. Однако при подключении через соединение OpenVPN я получаю исключение Connection refused to host при вызове метода (String response = lookup.helloTo(txt); в коде клиента) для удаленного объекта, возвращенного после успешного вызова lookup = (RMIInterface)Naming.lookup("//192.168.10.14/MyServer");.

Все мои Поиски в Google утверждают, что необходимо установить свойство java.rmi.server.hostname, что я и сделал в этом случае. Я думаю, что проблема может быть между IP-адресом клиента VPN (10.8.0.14) и IP-адресом сервера (192.168.10.14). Я могу пинговать IP-адрес сервера и успешно lnet к порту 1099 на сервере.

Вот мой код. Я надеялся, что кто-то может увидеть что-то, что я пропускаю или делаю неправильно, или я на правильном пути в отношении IP-адреса VPN-клиента <=> IP-адреса сервера.

Удаленный интерфейс:

package devel;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RMIInterface extends Remote {
    public String helloTo(String name) throws RemoteException;
}

Сервер:

package devel;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ServerOperation extends UnicastRemoteObject implements RMIInterface {
    private static final long serialVersionUID = 1L;

    protected ServerOperation() throws RemoteException {
        super();
    }

    @Override
    public String helloTo(String name) throws RemoteException {
        System.err.println(name + " is trying to contact!");

        return "Server says hello to " + name;
    }

    public static void main(String[] args) {
        try {
            java.lang.System.setProperty("java.rmi.server.hostname", "192.168.10.14");
            java.rmi.registry.LocateRegistry.createRegistry(1099);
            Naming.rebind("//192.168.10.14/MyServer", new ServerOperation());
            System.err.println("Server is ready");
        } catch(Exception exc) {
            System.err.println("Server exception: " + exc.toString());
            exc.printStackTrace();
        }
    }
}

Клиент:

package devel;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import javax.swing.JOptionPane;

public class ClientOperation {
    private static RMIInterface lookup;

    public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
        lookup = (RMIInterface)Naming.lookup("//192.168.10.14/MyServer");
        String txt = JOptionPane.showInputDialog("What is your name?");

        String response = lookup.helloTo(txt);
        JOptionPane.showMessageDialog(null, response);
    }
}

Получено исключение:

Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 192.168.10.14; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at com.sun.proxy.$Proxy0.helloTo(Unknown Source)
    at devel.ClientOperation.main(ClientOperation.java:17)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
    ... 8 more
...