RMI server bag router.....
A og B prøver at etablere kontakt mellem HelloServer og HelloClient ved hjælp af RMI:A sidder på en maskine, der er koblet til Internettet med et 56k modem.
B sidder tungt på en ADSL forbindelse sammen med sin maskine, der er koblet til Internettet gennem en router. B har ingen firewall, sidder ikke bag en proxyserver, så jeg kan ikke se at det er et tunnelproblem.
Når A kører HelloServer og B kører HelloClient går alt godt. Men omvendt begynder problemerne at vise sig:
B har sat sin router op så alle requests til routerens ip adresse xxx.xxx.xxx.xxx bliver ledt hen til B’s maskine. Et lille portcheckerprogram har bekræftet at A kan se at B har en port åben på port 8080.
B kan starte rmiregistry og kan starte HelloServer. B kan selv køre HelloClient uden problemer. Men når A kører HelloClient får han følgende fejlmeddelelse:
C:\javaClasses>java HelloClient xxx.xxx.xxx.xxx:8080
Exception in thread "main" java.rmi.ConnectException:
Connection refused to host: 192.168.1.2;
nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:101)
at HelloServer_Stub.sayHello(Unknown Source)
at HelloClient.main(HelloClient.java:21)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:295)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:161)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148)
at java.net.Socket.connect(Socket.java:425)
at java.net.Socket.connect(Socket.java:375)
at java.net.Socket.<init>(Socket.java:290)
at java.net.Socket.<init>(Socket.java:118)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(
RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(
RMIMasterSocketFactory.java:122)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:562)
... 5 more
Det jeg kan udlede er at HelloClient får forbindelse til den lokale ip adresse 192.168.1.2, men så er jeg blank….. Connection timed out….
Kildekode:
import java.rmi.*; // Remote, RemoteException
public interface HelloInterface extends Remote {
public String sayHello() throws RemoteException;
}
import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
public class HelloServer implements HelloInterface {
public HelloServer() throws RemoteException {
UnicastRemoteObject.exportObject(this);
}
public String sayHello() throws RemoteException {
return "Der er kommet svar";
}
public static void main(final String [] args) {
String registryHost = "127.0.0.1";
String port = null;
if (args.length > 0) {
port = args[0];
}
if (args.length > 1) {
System.err.println("HelloServer [port]");
System.exit(1);
}
final String registryURL = "rmi://"+ registryHost +":"+ port +"/hello";
try {
final HelloServer hello = new HelloServer();
Naming.rebind(registryURL, hello);
}
catch (RemoteException ReEx) {
System.err.println("Problem med Naming.rebind() "+ ReEx);
}
catch (MalformedURLException MaURLEx) {
System.err.println("Ulovlig URL " + MaURLEx);
}
}
}
import java.rmi.*;
public class HelloClient {
public static void main(String [] args) throws Exception {
String host = "127.0.0.1";
switch (args.length) {
case 0: break;
case 1: host = args[0]; break;
default: System.err.println("java HelloClient [host]"); System.exit(1);
}
String url = "rmi://" + host + "/hello";
HelloInterface hello = (HelloInterface) Naming.lookup(url);
String message = hello.sayHello();
System.out.println("HelloClient: " + message);
}
}
Hvad skal jeg gøre?