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

RMI übers Internet

1 view
Skip to first unread message

Reinhard Achleitner

unread,
Mar 31, 2004, 5:21:47 AM3/31/04
to
Hi!

Ich stehe vor folgendem Problem:

Auf einem Server läuft eine Java Applikation welche ein RemoteObjekt in
einer Registry registriert.
Der Server hat eine statische IP.
Jetzt möchte ich von einem Client aus, mich mit der RMI-Registry verbinden
und das Remote Objekt holen.
Dazu hab ich eine eigene SocketFactory geschrieben die keine anonymen Ports
verwendet und die benützten Ports (1097 für die registry und 8080 für die
Datenübertragung) hab ich auf beiden Rechnern im Router freigeschalten.

Starte ich jetzt die Client Applikation bekomme ich die korrekte Liste der
registrierten Objekte in der Registry, das Look Up funktioniert auch noch
(zumindest bekomme ich keine Exception) Nur wenn ich dann eine Methode auf
dieses Remote Objekt aufrufe bekomme ich nach einiger Zeit diese Exception:

Die IP 10.0.10.1 ist die lokale statische IP des Servers (nicht vom Internet
aus). Ist das vielleicht das Problem? Nur wo kann ich ihm das umdrehen?

java.rmi.ConnectException: Connection refused to host: 10.0.10.1; 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
at.ccenter.server.base.as.ActivityServer_Stub.processClientCall(Unkno

Hat schon mal jemand sowas gemacht?

liebe Grüße

Reinhard Achleitner


Raffael Herzog

unread,
Mar 31, 2004, 5:30:12 AM3/31/04
to
Reinhard Achleitner <reinhard....@crazy-team.at> wrote:

> java.rmi.ConnectException: Connection refused to host: 10.0.10.1; nested
> exception is:

java -Djava.rmi.server.hostname=yourhost ...

RMI verwendet per Default die lokale IP, um dem Client mitzuteilen, wo der
RMI-Server läuft. In einem NAT-Netz ist diese natürlich flachs. Daher am
besten einfach den Hostnamen eintragen, der DNS erledigt daraufhin den
Rest.

Gruss,
Raffi

--
Neu im Usenet? Fragen? -> http://www.use-net.ch/usenet_intro_de.html

Raffael Herzog - her...@raffael.ch - www.raffael.ch - ICQ #67961355

Reinhard Achleitner

unread,
Mar 31, 2004, 6:06:43 AM3/31/04
to
Kann ich da auch eine IP reinschreiben?

Hab ich versucht, er nimmt aber trotzdem den 10.0.10.1

lg

Reinhard

"Raffael Herzog" <dev...@raffael.ch> schrieb im Newsbeitrag
news:opr5p14m...@herzog.raffael.ch...

Reinhard Achleitner

unread,
Mar 31, 2004, 6:14:33 AM3/31/04
to
Es funktioniert mal so weit.

Jetzt hab ich ein problem, das der Server auch Callbacks zum Client machen
muss, der Server aber die lokale IP des CLients für den CallBack verwendet.

Kann ich ihm das irgendwie abdrehen, das er die echte IP nimmt?

lg

Reinhard

"Raffael Herzog" <dev...@raffael.ch> schrieb im Newsbeitrag
news:opr5p14m...@herzog.raffael.ch...

Raffael Herzog

unread,
Mar 31, 2004, 6:43:17 AM3/31/04
to
Reinhard Achleitner <reinhard....@crazy-team.at> wrote:

> Jetzt hab ich ein problem, das der Server auch Callbacks zum Client
> machen
> muss, der Server aber die lokale IP des CLients für den CallBack
> verwendet.
>
> Kann ich ihm das irgendwie abdrehen, das er die echte IP nimmt?

Vergiss das, Callbacks vom Server funktionieren nicht, wenn der Client
hinter einer nicht-fahrlässigen Firewall sitzt (was hoffentlich der Fall
ist). Keine halbwegs vernünftige Firewall wird eingehende Verbindungen zum
Client weiterleiten.

Falls es machbar ist, die Firewall extra für die Applikation anzupassen,
läuft es auf Client-Seite genau gleich, denn im Falle eines Callbacks ist
der Client ja der Server.

Reinhard Achleitner

unread,
Mar 31, 2004, 6:55:33 AM3/31/04
to
Ich habe die Möglichkeit beide Firewalls anzupassen, ist es dann möglich?

lg

Reinhard

"Raffael Herzog" <dev...@raffael.ch> schrieb im Newsbeitrag

news:opr5p5if...@herzog.raffael.ch...

Jochen Theodorou

unread,
Mar 31, 2004, 8:14:54 AM3/31/04
to
Reinhard Achleitner schrieb:

> Ich habe die Möglichkeit beide Firewalls anzupassen, ist es dann möglich?

Kommt darauf an.. Wenn du der beiden Firewalls sagst, dass alle
Verbindungen zwischen Computer A und Computer B durchgelassen werden
sollen, dann hast du nicht so grosse Probleme. Wenn es nur bestimmte
Ports sind die, du weiterleiten willst, dann musst du eine eigene
Socketfactory und mehr implementieren um RMI abzugewöhnen für jedes
Serverobjekt eine neue Verbindung mit einem nicht näher festgelegten
Port zu öffnen.

Gruss theo

Reinhard Achleitner

unread,
Mar 31, 2004, 8:20:48 AM3/31/04
to
Ich habe eine eigene SocketFactory geschrieben und nimm immer den gleichen
Port.

Es funktioniert ja auch alles, bis auf einen Callback, da dann der Server
versucht mit der lokalen IP des Clients den CallBack durchzuführen und nicht
mit der Internet IP des Clients.

Eine Idee wie ich das umgehen kann?

lg

Reinhard


"Jochen Theodorou" <blac...@uni.de> schrieb im Newsbeitrag
news:c4eg9t$2gsodn$1...@ID-138027.news.uni-berlin.de...

Jochen Theodorou

unread,
Mar 31, 2004, 9:50:17 AM3/31/04
to
Reinhard Achleitner schrieb:

> Ich habe eine eigene SocketFactory geschrieben und nimm immer den gleichen
> Port.

Ok, das ist dann mal geklärt.

> Es funktioniert ja auch alles, bis auf einen Callback, da dann der Server
> versucht mit der lokalen IP des Clients den CallBack durchzuführen und nicht
> mit der Internet IP des Clients.
>
> Eine Idee wie ich das umgehen kann?

Hast du probiert java.rmi.server.hostname auf die IP der Firewall zu setzen?


Gruss theo

Reinhard Achleitner

unread,
Mar 31, 2004, 10:00:58 AM3/31/04
to
Du meinst am Server die IP des Clients?

Ja hab ich.

Gruss
Reinhard


"Jochen Theodorou" <blac...@uni.de> schrieb im Newsbeitrag

news:c4elso$2e5v35$1...@ID-138027.news.uni-berlin.de...

Jochen Theodorou

unread,
Mar 31, 2004, 10:47:09 AM3/31/04
to
Reinhard Achleitner schrieb:

> Du meinst am Server die IP des Clients?

äähm nein.
folgendes angenommen:

Server --- Firewall A ---- Firewall B --- Client

Dann solst du beim Server java.rmi.server.hostname auf die IP von
Firewall A setzen und beim Client auf die von Firewall B bzw.
umgekehrt... ich weiss es nciht mehr ganz genau, am besten du probierst
beide Varianten

Gruss theo

Reinhard Achleitner

unread,
Mar 31, 2004, 11:13:07 AM3/31/04
to
Werd ich probieren!

Danke schon mal!

Gruß
Reinhard

Reinhard Achleitner

unread,
Apr 2, 2004, 4:01:48 AM4/2/04
to
So ich hab das jetzt ausprobiert, (beim Server hab ich den Hostnamen der
Server Firewall und beim Client den Hostnamen der CLient Firewall) (ich habs
auch umgekehrt probiert, klappt leider genausowenig).


Er nimmt zwar jetzt die richtige IP Adresse her für den CalBack aber ich
bekomme trotzdem eine Exception:

Die angegebene IP wäre die richtige des Clients, aber er kann keine
Verbindung aufbauen.


java.rmi.ConnectException: Connection refused to host: 62.47.45.31; 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

at.ccenter.common.base.communication.ServerCommunicator_Stub.exceptio
nOccured(Unknown Source)

Grüße

Reinhard


Jochen Theodorou

unread,
Apr 2, 2004, 4:59:43 AM4/2/04
to
Reinhard Achleitner schrieb:
[...]

> Er nimmt zwar jetzt die richtige IP Adresse her für den CalBack

Nun, das war ja erstmal das primäre Ziel.

> aber ich bekomme trotzdem eine Exception:
>
> Die angegebene IP wäre die richtige des Clients, aber er kann keine
> Verbindung aufbauen.
>
> java.rmi.ConnectException: Connection refused to host: 62.47.45.31;

[...]


> java.net.ConnectException: Connection timed out: connect

Tja was soll ich sagen... Die Konfiguration hast du im Griff. Scheinbar
stimmt entweder die IP nicht, oder die Firewall ist so konfiguriert,
dass sie alle falschen Zugriffe unbeantwortet lässt. Wenn du den Stub
ausgiebst, dann siehst du nicht nur die IP sondern auch den Port, der
benutzt wird, dann würde ich mal ethereal oder sowas nehmen und mal vor
der Firewall lauschen...

Gruss theo

Reinhard Achleitner

unread,
Apr 2, 2004, 5:22:14 AM4/2/04
to
Mein Verdacht ist, das er beim CallBack wieder einen anonymen Port nimmt,
nur wie kann ich den verwendeten Port ausgeben?

Gruß

Reinhard

"Jochen Theodorou" <blac...@uni.de> schrieb im Newsbeitrag

news:c4jdl6$2hq6kk$1...@ID-138027.news.uni-berlin.de...

Raffael Herzog

unread,
Apr 2, 2004, 5:37:04 AM4/2/04
to
Reinhard Achleitner <reinhard....@crazy-team.at> wrote:

> Mein Verdacht ist, das er beim CallBack wieder einen anonymen Port nimmt,
> nur wie kann ich den verwendeten Port ausgeben?

Den kannst du dem Konstruktor von UnicastRemoteObject übergeben. Am besten
holst du ihn dir aus irgend einer Konfigurations-Datei.

Reinhard Achleitner

unread,
Apr 2, 2004, 5:41:06 AM4/2/04
to
Ich weiß jetzt wo das Problem liegt. Für den CallBack nimmt er irgendeinen
Port.

Wie kann ich ihm das beibringen welchen Port er für den CallBack nehmen
soll?

Gruß

Reinhard

P.S: Das ist wirklich eine schwere Geburt :-)


"Jochen Theodorou" <blac...@uni.de> schrieb im Newsbeitrag

news:c4jdl6$2hq6kk$1...@ID-138027.news.uni-berlin.de...

Ortwin Glück

unread,
Apr 2, 2004, 5:42:12 AM4/2/04
to
Jochen Theodorou wrote:
> Kommt darauf an.. Wenn du der beiden Firewalls sagst, dass alle
> Verbindungen zwischen Computer A und Computer B durchgelassen werden
> sollen, dann hast du nicht so grosse Probleme.

Der Server muss aber auf jeden Fall eine öffentliche IP bekommen
(10.*.*.* ist privat). Erst dann kannst du der Firewall sagen, dass
Pakete für diesen Server durchgelassen werden sollen.

Jochen Theodorou

unread,
Apr 2, 2004, 5:43:53 AM4/2/04
to
Reinhard Achleitner schrieb:

> Mein Verdacht ist, das er beim CallBack wieder einen anonymen Port nimmt,
> nur wie kann ich den verwendeten Port ausgeben?

also zum Beispiel ein toString vom Stub... ansosnten weiss ich grad nicht

Gruss theo

Jochen Theodorou

unread,
Apr 2, 2004, 5:56:46 AM4/2/04
to
Reinhard Achleitner schrieb:

> Ich weiß jetzt wo das Problem liegt. Für den CallBack nimmt er irgendeinen
> Port.
> Wie kann ich ihm das beibringen welchen Port er für den CallBack nehmen
> soll?

Ich denke durch Nutzung einer eigenen RMIClientSocketFactory.

Gruss theo

Reinhard Achleitner

unread,
Apr 2, 2004, 6:06:36 AM4/2/04
to
So, jetzt funktionieren die CallBacks auch.

Ich habe einfach noch beim UnicastRemoteObjekt des Clients den Port fix
gesetzt.

Nur jetzt bekomme ich ab und zu folgende Exception:

java.rmi.MarshalException: error marshalling arguments; nested exception is:
java.net.SocketException: Connection reset by peer: socket write
error
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at
at.ccenter.common.base.communication.ServerCommunicator_Stub.processServerCa
ll(Unknown Source)
at
at.ccenter.server.base.as.ActivityServer.callActivity(ActivityServer.java:57
3)
at
at.ccenter.server.base.as.ActivityServer.access$2(ActivityServer.java:446)
at
at.ccenter.server.base.as.ActivityServer$3.run(ActivityServer.java:432)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write
error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown
Source)
at
java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
... 6 more

Weiß jemand woran das liegen kann?

Gruß
Reinhard

Jochen Theodorou

unread,
Apr 4, 2004, 7:28:55 AM4/4/04
to
Reinhard Achleitner schrieb:

> So, jetzt funktionieren die CallBacks auch.
>
> Ich habe einfach noch beim UnicastRemoteObjekt des Clients den Port fix
> gesetzt.
>
> Nur jetzt bekomme ich ab und zu folgende Exception:
>
> java.rmi.MarshalException: error marshalling arguments; nested exception is:
> java.net.SocketException: Connection reset by peer: socket write
> error
[....]

> Weiß jemand woran das liegen kann?

Also es scheint als habe jemand auf einen bereits geschlossenen Socket
schrieben wollen. Möglicherweise machst du auch irgendwo ein
System.exit, was den Socket geschlossen hatte und jetzt versucht jemand
anderes darauf zuzugreifen.

Gruss theo

0 new messages