Java RMI: ConnectException: Тайм-аут соединения: соединение

Я понимаю, что этот вопрос задавался много раз и отвечал много раз (часто из EJP, который ясно знает свое дело!), Но я все еще борюсь.

Я "украл" простой сервер и клиент RMI Adding. (Спасибо, http://www.scs.ryerson.ca/mes/courses/cps530/programs/rmi/Schildt/addTwoNumbers.html который затем отдает должное главе 24 "Java 2: Полная ссылка" П. Нотон и Х. Шильдт.)

Независимо от того, что я пытаюсь, я все равно получаю это исключение "Тайм-аут соединения". Кто-нибудь может увидеть, что я сделал не так?

Я подозреваю, что с брандмауэром что-то происходит, но если это так, я не знаю, что сказать моим ИТ-специалистам, чтобы они исправили и изменили.

Заранее спасибо!

Интерфейс:

public interface AddServerIntf extends Remote {
    double add(double d1, double d2) throws RemoteException;
}

Сервер:

public class SimpleRMIExServer {
    public static void main(String[] args) throws Exception {    
        System.out.println("Class name " + SimpleRMIExServer.class.getSimpleName());
        System.out.println("Path " + System.getProperty("user.dir"));
        System.setProperty("java.rmi.server.codebase",
                "file:///D:\\SimpleRMIExample\\lib\\SimpleRMIExample.jar");
        Registry registry;
        try {
            registry = LocateRegistry.createRegistry(1099);
        } catch (RemoteException remoteException) {
            registry = LocateRegistry.getRegistry(1099);
        }
        AddServerImpl addServerImpl = new AddServerImpl();
        registry.bind("AddServer", addServerImpl);
        System.out.println("Located Registry " + registry.toString());
        for (String boundName : registry.list()) {
            System.out.println("Name bound: " + boundName);
        }
        Naming.rebind("SERVERNAME", addServerImpl);
        System.out.println("Registry: " + registry);
        System.out.println("");
        System.out.println("Remote: " + addServerImpl);
    }    
}
public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
    public AddServerImpl() throws RemoteException {
    }

    @Override
    public double add(double d1, double d2) throws RemoteException {
        return d1 + d2;
    }
}

Клиент:

public class SimpleRMIExClient {
   public static void main(String[] args) throws Exception {
     final Registry registry = LocateRegistry.getRegistry("SERVERNAME", 1099);
     AddServerIntf addServerIntf = (AddServerIntf) registry.lookup("AddServer");
     System.out.println("The first number is: " + 10);
     double d1 = Double.valueOf(10).doubleValue();
     System.out.println("The second number is: " + 15);
     double d2 = Double.valueOf(15).doubleValue();
     System.out.println("The sum is: " + addServerIntf.add(d1, d2)); //Exception occurs here.
   }
}

Вывод с сервера:

D:\>java -jar SimpleRMIExServer.jar
Class name SimpleRMIExServer
Path D:\
Located Registry RegistryImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:
1099](local),objID:[0:0:0, 0]]]]
Name bound: AddServer
Registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:1099](l
ocal),objID:[0:0:0, 0]]]]

Remote: AddServerImpl[UnicastServerRef [liveRef: [endpoint:[XX.XX.XX.XX:54119](l
ocal),objID:[2a7202aa:14492e5ea89:-7fff, -5034491972061237368]]]]

Выход из клиента:

debug:
The first number is: 10
The second number is: 15
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: XX.XX.XX.XX; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    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:129)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 33 seconds)

Кроме того, я использовал команду netstat -a, и она показала:

LocalAddress       ForeignAddress    State
0.0.0.0:1099       SERVERNAME:0      LISTENING
[::]:1099          SERVERNAME:0      LISTENING
XX.XX.XX.XX:53373  SERVERNAME:1099   ESTABLISHED

(Среди многих других строк) я также видел:

LocalAddress       ForeignAddress    State
XX.XX.XX.XX:54138   SERVERNAME:1099  TIME_WAIT

Изменить: я пытался добавить в:

System.setProperty("java.rmi.server.hostname", "SERVERNAME");

на сервер сразу после установки свойства System базы кода, основываясь на рекомендациях EJP, чтобы многие другие читали FAQ по Java RMI A.1.

Когда я это сделал, это была трассировка стека:

debug:
The first number is: 10
The second number is: 15
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: SERVERNAME; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    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:129)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at com.sun.proxy.$Proxy0.add(Unknown Source)
    at simplermiexclient.SimpleRMIExClient.main(SimpleRMIExClient.java:35)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 15 seconds)

Отвечая на мой собственный вопрос: я выяснил ответ на мою проблему. Я люблю видеть, как другие делают это, хорошо, что я могу сказать это сам.

Моим окончательным решением была проблема с брандмауэром, но я хотел бы дать кому-нибудь предложения, КАК я решил свою проблему.

  1. Сломай. Возьмите мой код выше, который на самом деле не мой код, и сделайте гораздо более простую версию RMI-сервера и протестируйте его.

  2. Начните с малого и продолжайте свой путь. Начните с localhost, убедитесь, что он работает, затем протестируйте на отдельном ПК (у меня был виртуальный ПК), затем протестируйте на своем сервере.

  3. ПОЛУЧИТЬ ПОМОЩЬ! Я искал в Интернете много. Спасибо, EJP! Кроме того, как только я наконец-то начал работать на Виртуальном ПК, но не на сервере, я включил своих ИТ-специалистов, и они обнаружили разницу между ними. "На ПК был установлен параметр брандмауэра, связанный с Java, который не был установлен на сервере". - ИТ-парень (см.: http://windows.microsoft.com/en-us/windows/communicate-through-windows-firewall)

Я понимаю, что то, что я сказал здесь, не является чем-то новым, и я знаю, что слышал это много раз, но иногда нужно услышать это тысячу раз, чтобы наконец принять. Хотя это еще не сработало с моими детьми.;-)

Удачи.

1 ответ

(Ответ на вопрос отредактирован. Преобразован в вики-ответ сообщества. См. Вопрос без ответов, но проблема решена в комментариях (или расширена в чате))

ОП написал:

Отвечая на мой собственный вопрос: я выяснил ответ на мою проблему. Я люблю видеть, как другие делают это, хорошо, что я могу сказать это сам.

Моим окончательным решением была проблема с брандмауэром, но я хотел бы дать кому-нибудь предложения, КАК я решил свою проблему.

  1. Сломай. Возьмите мой код выше, который на самом деле не мой код, и сделайте гораздо более простую версию RMI-сервера и протестируйте его.

  2. Начните с малого и продолжайте свой путь. Начните с localhost, убедитесь, что он работает, затем протестируйте на отдельном ПК (у меня был виртуальный ПК), затем протестируйте на своем сервере.

  3. ПОЛУЧИТЬ ПОМОЩЬ! Я искал в Интернете много. Спасибо, EJP! Кроме того, как только я наконец-то начал работать на Виртуальном ПК, но не на сервере, я включил своих ИТ-специалистов, и они обнаружили разницу между ними. "На ПК был установлен параметр брандмауэра, связанный с Java, который не был установлен на сервере". - ИТ-парень (см.: http://windows.microsoft.com/en-us/windows/communicate-through-windows-firewall)

Я понимаю, что то, что я сказал здесь, не является чем-то новым, и я знаю, что слышал это много раз, но иногда нужно услышать это тысячу раз, чтобы наконец принять. Хотя это еще не сработало с моими детьми.;-)

Удачи.

Другие вопросы по тегам