Grrr,我觉得这应该很明显,但是我找不到解决方法。
出于测试目的,我为RMI应用程序创建了一个简单的客户端和服务器。我可以通过本地网络成功运行客户端和服务器。通过Windows 10内置VPN连接进行连接时,我也可以成功运行该应用程序。但是,当通过OpenVPN连接进行连接时,在成功调用Connection refused to host
返回的远程对象上调用方法(客户端代码中的String response = lookup.helloTo(txt);
)时,我收到lookup = (RMIInterface)Naming.lookup("//192.168.10.14/MyServer");
异常。>
我所有的Google搜索都指出必须设置java.rmi.server.hostname
属性,在这种情况下,我必须这样做。我认为问题可能出在VPN客户端IP地址(10.8.0.14)和服务器IP地址(192.168.10.14)之间。我可以成功地将服务器IP地址和telnet ping到服务器上的端口1099。
这是我的代码。我希望有人能看到我遗失或做错的事情,或者我是否在关于VPN客户端IP 服务器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