我们正试图让RMI通过互联网工作。我们尝试了什么:
- 客户端和服务器端的端口转发 (1099-1100)。
- 关闭Windows和路由器中的防火墙
- 尝试过与 tunngle (www.tunngle.net/)
我们的RMI接口:
import java.rmi.RemoteException;
public interface RMIInterface extends java.rmi.Remote {
public void helloWorld(int i) throws RemoteException;
}
我们的 RMI 服务器实现:
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class RMIServerTest extends UnicastRemoteObject implements RMIInterface {
public RMIServerTest() throws RemoteException {
}
@Override
public void helloWorld(int i) throws RemoteException {
for (int j = 0; j < i; j++) {
System.out.println("Hello World");
}
}
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
}
catch (RemoteException ex) {
System.out.println(ex.getMessage());
}
try {
Naming.rebind("Server", new RMIServerTest());
} catch (MalformedURLException ex) {
System.out.println(ex.getMessage());
} catch (RemoteException ex) {
System.out.println(ex.getMessage());
}
}
}
和我们的客户:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class RMIClient {
public static void main(String[] args) throws RemoteException, NotBoundException,MalformedURLException {
try {
RMIInterface serverObject = (RMIInterface) Naming.lookup("//externalServerAdress/Server");
serverObject.helloWorld(10);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
我们仍然收到此错误:
Connection refused to host: 192.168.0.13; nested exception is:
java.net.ConnectException: Connection timed out: connect
192.168.0.13 是路由器后面的服务器的本地 IP 地址。我们使用路由器的外部IP在客户端上连接。像"2.246.133.155" = 外部服务器地址。所以我们有联系。我们通过服务器的外部IP地址(WAN IP)进行连接并显示错误,它获取服务器的本地IP地址,但仍然拒绝连接。
谢谢任何提示。
Connection refused to host: 192.168.0.13
那不是互联网地址。它是仅存在于路由器后面的专用地址。您需要使用您的公共 IP 地址,并通过路由器安排端口转发。