Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[RMI] ConnectException

0 views
Skip to first unread message

Alexander Reifinger

unread,
Jul 14, 2002, 9:38:46 AM7/14/02
to
Hallo,

Ich will eine Methode via RMI aufrufen. Das hat auch schon mal geklappt,
aber scheinbar übersehe ich jetzt einen Schritt, wenn ich es erneut
probiere.

Ich habe eine Klasse AImpl, die von dem Interface A erbt. A hat die
Method public String a() throws RemoteException.

Lokaler Aufruf von new AImpl().a() klappt.

rmic AImpl erzeugt mit Stub und Skel ohne Fehler.

rmiregistry startet.

Dann wird mit Naming.rebind("Test",new AImpl()) das Objekt an die
Registry gebunden.

Ein in der Registrierungsklasse direkt anschliessender Aufruf von
A a = (A)Naming.lookup("Test");
System.out.println(a.a());
klappt.

Wenn ich aber in einem anderen Programm obige 2 Zeilen angebe, gibt er
mir den Fehler im Anhang (ConnectException auf 10.0.0.1).

10.0.0.1 ist meine LAN-IP, mir ist eh unklar warum er die benutzt und
nicht 127.0.0.1 (selbst wenn ich einen Lookup auf
rmi://127.0.0.1:1099/Test mache benutzt er 10.0.0.1)

Firewall läuft keine, es ist auch kein Applet, SecurityManager ist nicht
gesetzt.

Jemand eine Idee was ich falsch mache?

Danke,
Alexander

java.rmi.ConnectException: Connection refused to host: 10.0.0.1; nested
exception is:
java.net.ConnectException: Connection refused: connect
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:320)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:133)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:120)
at java.net.Socket.<init>(Socket.java:273)
at java.net.Socket.<init>(Socket.java:100)
at
sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:25)
at
sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:120)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:499)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:190)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:174)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:83)
at AImpl_Stub.a(Unknown Source)

Jochen Theodorou

unread,
Jul 14, 2002, 10:41:00 AM7/14/02
to
Alexander Reifinger schrieb:
[...]

>
> Wenn ich aber in einem anderen Programm obige 2 Zeilen angebe, gibt er
> mir den Fehler im Anhang (ConnectException auf 10.0.0.1).
>
> 10.0.0.1 ist meine LAN-IP, mir ist eh unklar warum er die benutzt und
> nicht 127.0.0.1 (selbst wenn ich einen Lookup auf
> rmi://127.0.0.1:1099/Test mache benutzt er 10.0.0.1)
>
> Firewall läuft keine, es ist auch kein Applet, SecurityManager ist nicht
> gesetzt.
>
> Jemand eine Idee was ich falsch mache?

Lass mich mal raten.. es ist ein Linux-Rechner.. Genau dein Problem
hatte ich mal an einem Linuxrechner an der Uni. Sonst lief überall das
Programm und ich hatte damals auch in der Newsgroup gefragt, ob da
jemand eine Idee hat woran das liegen könnte. Das einzige, was mir
damals auffiel war, dass die NEtzwerkkonfiguration etwas "seltsam" war.
Genauer konnte ich das damals nciht machen, weil ich dann auf einen
anderen Pool ausgewichen bin, bei dem alles tat. Leider kann ich mich
derzeit nicht auf diese Rechner einloggen, sonst würde ich mir das
nochmal anschauen. Aber vielleicht schreibst du erstmal, ob es überhaupt
ein Linuxrechner ist und wenn ja dann welche Disritibution und welche
Netzwerkkonfiguration. Vielleicht kann ich dir dann helfen.

Gruss theo

Alexander Reifinger

unread,
Jul 14, 2002, 11:03:35 AM7/14/02
to

Nein, es ist eine WinXP-Kiste. Ich denke auch nicht, dass es an den
Netzwerkeinstellungen liegt, da es ja in der Register-Klasse geht.

Servus,
Alexander

Jochen Theodorou

unread,
Jul 14, 2002, 12:16:43 PM7/14/02
to
Alexander Reifinger schrieb:
[...]

> Nein, es ist eine WinXP-Kiste. Ich denke auch nicht, dass es an den
> Netzwerkeinstellungen liegt, da es ja in der Register-Klasse geht.

Dann mache ich dir einen anderen Vorschlag.. man mache ein minimales
Beispiel und teste ob das tut :

public interface Hello extends java.rmi.Remote {

public String hello() throws java.rmi.RemoteException;
}


public class HelloImpl extends java.rmi.server.UnicastRemoteObject
implements Hello {

public HelloImpl() throws RemoteException {
super();
}

public static void main(String[] args) {
try {
HelloImpl obj = new HelloImpl();
Naming.rebind("rmi://localhost:1200/HelloImpl", obj);
} catch (RemoteException ex) {
ex.printStackTrace();
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
}

public String hello() throws java.rmi.RemoteException {
return "hello";
}

}

public class HelloClient extends Object {

public HelloClient() {
}

public static void main(String args[]) throws Exception{
Hello hello = (Hello)
Naming.lookup("rmi://localhost:1200/HelloImpl");
System.err.println(hello.hello());
}
}

probiere dieses Programm aus und sage mir ob das tut.

Gruss theo

Alexander Reifinger

unread,
Jul 15, 2002, 4:28:14 AM7/15/02
to
Jochen Theodorou wrote:
> Alexander Reifinger schrieb:
> [...]
>
>> Nein, es ist eine WinXP-Kiste. Ich denke auch nicht, dass es an den
>> Netzwerkeinstellungen liegt, da es ja in der Register-Klasse geht.
>
>
> Dann mache ich dir einen anderen Vorschlag.. man mache ein minimales
> Beispiel und teste ob das tut :
>

OK, ich hab das Problem erkannt, verstehe es aber nicht:

Naming.rebind() startet wohl einen Thread, der nicht abgebrochen werden
darf. Meine Registrationsklasse hatte aber ein System.exit(0) am Ende.

Wieso muss dieser Thread laufen, ich dachte die rmiregistry übernimmt
das Objekt, wieso muss ich die registry und den registrierthread beide
am server laufen haben?

In Hoffnung auf erhellende Einsichten,
Alexander

Jochen Theodorou

unread,
Jul 15, 2002, 6:05:35 AM7/15/02
to
Alexander Reifinger schrieb:

> Jochen Theodorou wrote:
>
>> Alexander Reifinger schrieb:
[...]
>
> OK, ich hab das Problem erkannt, verstehe es aber nicht:
>
> Naming.rebind() startet wohl einen Thread, der nicht abgebrochen werden
> darf. Meine Registrationsklasse hatte aber ein System.exit(0) am Ende.

da habe ich mir ehrlich gesagt mnoch nie Gedanken darüber gemacht.

> Wieso muss dieser Thread laufen, ich dachte die rmiregistry übernimmt
> das Objekt, wieso muss ich die registry und den registrierthread beide
> am server laufen haben?

ich denke es ist so, dass die Registrie unabhängig ist von den Objekten,
die an sie gebunden werden. Wenn man den Server stoppt, dann wird in der
Registry ein Objekt angezeit, aber dahinter steht kein existierendes
Objekt mehr, sondern nur ein ungültiger Eintrag. Wenn die Registry
gestoppt wird, dann kann man sich logischerweise nicht mehr mit der
Registry verbinden. Dein Registrierthread ist Teil deines
Serverprogrammes. Ein Abbruch dieses Threads bedeutet einen Abbruch des
Serverprogrammes. Das Serverprogramm muss aber laufen, damit Methoden
davon ausgeführt werden können. System.exit ist nun dazu da die VM zu
beenden und nicht um einzelne Threads zu verlassen. Alles klar?
Wenn dich das ärgert, dann kannst du die Registry ja von deinem Server
erzeugen lassen - ich glaube createRegistry Methode.

Ich hoffe das hilft.
theo


Alexander Reifinger

unread,
Jul 15, 2002, 7:11:41 AM7/15/02
to
Jochen Theodorou wrote:
>> Wieso muss dieser Thread laufen, ich dachte die rmiregistry übernimmt
>> das Objekt, wieso muss ich die registry und den registrierthread beide
>> am server laufen haben?
>
> ich denke es ist so, dass die Registrie unabhängig ist von den Objekten,
> die an sie gebunden werden. Wenn man den Server stoppt, dann wird in der
> Registry ein Objekt angezeit, aber dahinter steht kein existierendes
> Objekt mehr, sondern nur ein ungültiger Eintrag. Wenn die Registry
> gestoppt wird, dann kann man sich logischerweise nicht mehr mit der
> Registry verbinden. Dein Registrierthread ist Teil deines
> Serverprogrammes. Ein Abbruch dieses Threads bedeutet einen Abbruch des
> Serverprogrammes. Das Serverprogramm muss aber laufen, damit Methoden
> davon ausgeführt werden können. System.exit ist nun dazu da die VM zu
> beenden und nicht um einzelne Threads zu verlassen. Alles klar?
> Wenn dich das ärgert, dann kannst du die Registry ja von deinem Server
> erzeugen lassen - ich glaube createRegistry Methode.


Ach so ist das, ich dachte die Registry übernimmt das Objekt, aber das
kann ja natürlich nicht gehen, die läuft ja in einer anderen VM...

Im nachhinein ist immer alles viel klarer.

Danke,
Alexander

0 new messages