RMI & Connection refused to host

Status
Nicht offen für weitere Antworten.

boesi

Aktives Mitglied
moin

Ich habe eine kleine Client-/Serveranwendung geschrieben, die mittels RMI kommuniziert.

Im lokalen Netz funktioniert das auch wunderbar über Rechnergrenzen hinweg (konkret: Serverprogramm läuft in einer virtuellen Machine [VMware] und das Clientprogramm hab ich auf 2 Rechnern erfolgreich getestet.)

Nun soll das Serverprogramm aber auf einem "richtigen" Server (Windows Server 2003) laufen und die Clientprogramme auf beliebigen Rechnern im Internet. Also auf dem Server den Port 1099 freigegeben - aber funktioniert nicht.

Eine Verbindung kann ich scheinbar aufbauen, zumindest liefern folgende Zeilen keine Exception:
Code:
Registry reg = LocateRegistry.getRegistry(Konst.addrServer);
RMIConnector server = (RMIConnector) reg.lookup(Konst.rmiName);
Das Serverprogramm gibt dabei aus:
Code:
16.08.2007 14:32:14 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(3)-91.64.35.41: [91.64.35.41: sun.rmi.registry.Regist
ryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Aber der direkt darauf folgende entfernte Methodenaufruf führt beim Server zu gar keiner Reaktion, und der Client liefert "java.rmi.ConnectException: Connection refused to host: ..."

Dabei ist es egal, ob der Client per NAT ins Internet geht oder direkt eine im I-Net gültige IP-Adresse bekommt. Die IP-Adresse des Servers ist direkt erreichbar. Firewall gib's auf beiden Seiten keine, auf dem Server läuft ein Packetfilter (in dem wie gesagt Port 1099 freigeschalten ist). Einen Securitymanager verwende ich nicht. Andere Dienste auf dem Server wie zB Tomcat sind ohne Probleme erreichbar.

Und was mach ich nun? <= bin ziemlich ratlos


Vielen Dank schon mal für eure Hilfe
cu boesi


Hier der komplette Stacktrace des Clientprogramms:
Code:
java.rmi.ConnectException: Connection refused to host: ***hostname***; 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 java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
	at $Proxy0.login(Unknown Source)
	at bnclient.RMIClient.login(RMIClient.java:49)
	at bnclient.Login.login(Login.java:74)
	at bnclient.Login$EvtKeys.keyReleased(Login.java:52)
	at java.awt.Component.processKeyEvent(Unknown Source)
	at javax.swing.JComponent.processKeyEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.Dialog$1.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
	... 39 more
 

boesi

Aktives Mitglied
L-ectron-X hat gesagt.:
Welchen Port und auf welcher Seite meinst du?
Auf dem Server ist der Port 1099, wie schon gesagt, offen. Und das Serverprogramm scheint die Verbindung ja auch zu akzeptieren (soweit ich RMI bisher verstanden hab).


cu boesi
 

boesi

Aktives Mitglied
'Tschuldigung dass ich erst jetzt antworte, ich war die letzten Tage ausser Landes (... naja fast, zumindest offline)

L-ectron-X hat gesagt.:
OK, dann bau doch erst mal einen RMISecurityManager ein.
Meinst du auf Client- oder Server-Seite?
Auf jeden Fall hatte ich den auf beiden Seiten am Anfang mit drin, weil steht ja so in jedem Tutorial beschrieben. Hab den dann aber rausgenommen, weil es nur Zugriffsverweigerungen gab. Ausserdem war ich der Meinung, dass der SecurityManager nichts mit dem Problem hier zu tun hat (aber wahrscheinlich wird wohl doch zwischen Verbindungen im LAN und WAN unterschieden). Und ich benutze RMI nur um entfernte Methoden aufzurufen und nicht um Code zu übertragen, der auf der anderen Seite ausgeführt werden soll.

=====================================================
[Eigentlich sollte hier ein etwas länglicher Teil hin, der meine Probleme mit dem Security Manager beschreibt. Stattdessen funktioniert der Security Manager nun im LAN - ich hasse Tutorials, die einem nur die Hälfte erzählen.]

Im Client hab ich nun eine Methode connect mit dem Inhalt:
Code:
if (System.getSecurityManager() == null) {
	System.setSecurityManager(new RMISecurityManager());
}
Registry reg = LocateRegistry.getRegistry(Konst.addrServer);
RMIConnector server = (RMIConnector) reg.lookup(Konst.rmiName);
return server;
Die main-Methode des Servers tut folgendes:
Code:
if (System.getSecurityManager() == null) {
      System.setSecurityManager(new RMISecurityManager());
}
try {  // ja  das ist Absicht, ich will kein zusätzliches Programm starten müssen
      LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
} catch (RemoteException exc) { [...]  }
try {
      // BNServer implementiert das Interface RMIConnecter, das wiederum das Interface Remote implementiert                        
      RMIConnector rmiConn = new BNServer();
      RMIConnector rmiStub = (RMIConnector) UnicastRemoteObject.exportObject(rmiConn, 0);
      RemoteServer.setLog(System.out);
      Registry reg = LocateRegistry.getRegistry();
      reg.rebind("BNServer", rmiStub);
} catch (Exception exc) { [...] }
Die Policy-Dateien haben jeweils den gleichen Inhalt:
Code:
grant {
	permission java.security.AllPermission;
};
Die Policy geb ich nun beim starten jeweils mit "-Djava.security.policy=Policy-Datei" an. Im LAN funktioniert das auch inklusive Zugriff auf MySQL. Im WAN funktioniert "reg.lookup" - aka liefert keine Exception. Aber die eigentliche Methode auf dem Server wird nicht aufgerufen - also auch nix mit Exception. Der Client kommt dann irgendwann mit:
Code:
java.rmi.ConnectException: Connection refused to host: berufsnavigator.de; nested exception is:
        java.net.ConnectException: Connection timed out: connect
Und das ganze ist davon unabhängig ob ich einen SecurityManager verwende oder nicht.


cu boesi
 

boesi

Aktives Mitglied
L-ectron-X hat gesagt.:
Und wie sieht dein URL für den Server aus?
im lokalen Fall einfach der DNS-Name - murphy2k
sprich der Client verwendet 'LocateRegistry.getRegistry("murphy2k")'
den Server starte ich mit 'java -cp %CP% -Djava.rmi.server.hostname=murphy2k -Djava.security.policy=%PolicyFile% bnserver.BNServer'

Beim Server im Internet verwende ich entsprechend einfach den Domainnamen. Die IP-Adresse funktioniert genausowenig.


cu boesi
 

boesi

Aktives Mitglied
L-ectron-X hat gesagt.:
Setze doch mal den Protokollnamen noch davor.
Also rmi:// oder http://
Du meinst in etwa so: 'java -cp %CP% -Djava.rmi.server.hostname=rmi://murphy2k -Djava.security.policy=%PolicyFile% bnserver.BNServer' ?
Das Serverprogramm läßt sich so starten. Wenn ich im Client 'LocateRegistry.getRegistry("rmi://murphy2k");' angeb, liefert das darauf folgende lookup die Exception:
Code:
java.rmi.UnknownHostException: Unknown host: rmi://murphy2k; nested exception is: 
	java.net.UnknownHostException: rmi://murphy2k
	...
Interessant wird's, wenn ich im Client das rmi:// weglass. Dann wird genau diese Exception erst durch den Aufruf der entfernten Methode ausgelöst.

Mit HTTP ist's das gleiche.

cu boesi
 

L-ectron-X

Gesperrter Benutzer
Naja, der Client soll zu einer entfernten RMIRegistry Verbindung aufnehmen und dort ein Remote-Objekt suchen/finden, welches mit einem Namen dort registriert ist.
Die Suche eines Remote-Objektes in der entfernten RMIRegistry sollte in etwa so aussehen:
Code:
RemoteObject obj = (RemoteObject)Naming.lookup("http://host/name");
 
G

Guest

Gast
boesi hat gesagt.:
L-ectron-X hat gesagt.:
Und wie sieht dein URL für den Server aus?
im lokalen Fall einfach der DNS-Name - murphy2k
sprich der Client verwendet 'LocateRegistry.getRegistry("murphy2k")'
den Server starte ich mit 'java -cp %CP% -Djava.rmi.server.hostname=murphy2k -Djava.security.policy=%PolicyFile% bnserver.BNServer'

Beim Server im Internet verwende ich entsprechend einfach den Domainnamen. Die IP-Adresse funktioniert genausowenig.


cu boesi

schreib die offentliche IP-Adresse des Gateway-Routers anstelle von "murphy2k"
 

boesi

Aktives Mitglied
L-ectron-X hat gesagt.:
Naja, der Client soll zu einer entfernten RMIRegistry Verbindung aufnehmen und dort ein Remote-Objekt suchen/finden, welches mit einem Namen dort registriert ist.
Die Suche eines Remote-Objektes in der entfernten RMIRegistry sollte in etwa so aussehen:
Code:
RemoteObject obj = (RemoteObject)Naming.lookup("http://host/name");
Code:
java.net.MalformedURLException: invalid URL scheme: [url]http://murphy2k/BNServer[/url]
wenn ich statt http rmi nehm, funktioniert alles [nicht] wie gehabt - besteht zwischen dieser und meiner zweigeteilten Variante (die ich nebenbei direkt von Sun hab) überhaupt ein praktischer Unterschied?


cu boesi
 

boesi

Aktives Mitglied
Anonymous hat gesagt.:
schreib die offentliche IP-Adresse des Gateway-Routers anstelle von "murphy2k"
Ähm zu murphy2k funktioniert alles, was nicht funktioniert ist der Server im Internet (dessen Domain ich hier nicht bekanntgeb - ein klein wenig Privatsphäre muss sein).

Der Server ist direkt über eine öffentliche IP erreichbar. Der Client ist über einen Router und Kabelmodem ans Internet angebunden. Aber die Probleme bestehen auch, wenn ich den Rechner mit dem Client direkt ans Modem häng (und dann eine öffentliche IP bekommt).


cu boesi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A RMI java.rmi.ConnectException: Connection refused to host: 1 Netzwerkprogrammierung 4
R ConnectException: Connection refused to host: 192.168.1.4 ? Netzwerkprogrammierung 8
tfa RMI-Problem: Connection refused to host: 127.0.0.2 Netzwerkprogrammierung 4
M Connection refused? Netzwerkprogrammierung 2
D Connection refused Netzwerkprogrammierung 3
C Socket Connection refused bei Internetverbindung - Welcher Port? Netzwerkprogrammierung 5
H java.net.ConnectException: Connection refused Netzwerkprogrammierung 3
H RMI Connection refused bei RMI-Registry Netzwerkprogrammierung 10
A Chatprogramm: Connection refused Netzwerkprogrammierung 4
T RMI RMI und VPN - callbackObject Connection refused Netzwerkprogrammierung 13
0din Connection refused bei localhost?! Netzwerkprogrammierung 7
M chat funktioniert nicht (Connection refused: connect) Netzwerkprogrammierung 3
D Socketverbindung schlägt fehl - Connection refused: connect Netzwerkprogrammierung 4
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
F Probleme mit Connection Reset bei Telnet Verbindung Netzwerkprogrammierung 1
Thalion TCP Connection zu langsam Netzwerkprogrammierung 2
S Client Server Connection Netzwerkprogrammierung 4
C Handle Connection Problem Netzwerkprogrammierung 3
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
L ssh connection; Zugriff auf 'screen' Prozess Netzwerkprogrammierung 5
C Client connection per Portforwarding auf einen lokalen Serverport Netzwerkprogrammierung 3
B Client/Server Connection Problem Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
K Socket Exception Connection reset Netzwerkprogrammierung 9
VfL_Freak Socket SocketException: Connection reset Netzwerkprogrammierung 11
C Socket Socket: Connection timed out Netzwerkprogrammierung 3
T Empfangen klappt Senden nicht - Connection timed out Netzwerkprogrammierung 12
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
RELAXccc HTTP Connection timed out: connect ?an was kann es liegen? Netzwerkprogrammierung 4
G Exception: Connection reset by peer: socket write error Netzwerkprogrammierung 2
N Socket verliert die Connection. Netzwerkprogrammierung 4
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
M RMI - Connection Problem Netzwerkprogrammierung 7
trash HTTP Internet Connection bei Proxy ?! Netzwerkprogrammierung 3
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
S SSH-Connection - Auto-Vervollständigung mittels TAB Netzwerkprogrammierung 4
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
J Connection Speed Test ohne Applet Netzwerkprogrammierung 5
M FTP-Connection über FTP-Proxy Netzwerkprogrammierung 20
T Wie connection Reset abfragen/abfangen? Netzwerkprogrammierung 10
G InputStreamReader lässt TCP-Connection offen Netzwerkprogrammierung 9
X URL connection Problem Netzwerkprogrammierung 3
sparrow Connection Reset bei Webserver, Java WebStart als Client Netzwerkprogrammierung 9
G Connection zu MySQL ohne ODBC Netzwerkprogrammierung 8
IT-MaD Connection reset by peer: socket write error Netzwerkprogrammierung 2
G httpUnit: Connection timed out Netzwerkprogrammierung 3
lhein java.io.IOException: Unable to establish loopback connection Netzwerkprogrammierung 4
Paule Connection Applet Servlet ohne Socket bzw RMI Netzwerkprogrammierung 2
B Multithreaded Server: Connection reset Netzwerkprogrammierung 4
T JDBC Verbindungsabbruch (Connection reset) Netzwerkprogrammierung 2
M SocketException: Connection reset Netzwerkprogrammierung 10
G MAC / IP Connection Netzwerkprogrammierung 10
M Problem: connection abbrechen und login erkennen Netzwerkprogrammierung 2
M Umlaute gehen bei URL Connection verloren Netzwerkprogrammierung 6
M seltsam: java.net.SocketException: Connection reset Netzwerkprogrammierung 1
B RMI Connection Problem Netzwerkprogrammierung 13
T Dateien wia P2P Connection versenden Netzwerkprogrammierung 2
H java.net.SocketException: Software caused connection abort Netzwerkprogrammierung 4
R FTP Connection zu Server Netzwerkprogrammierung 4
M Ausgangsport für FTp-Connection festlegen??? Netzwerkprogrammierung 3
L Kann VM nicht ueber Host Name finden Netzwerkprogrammierung 0
E HTTP java.lang.IllegalArgumentException: protocol = http host = null Netzwerkprogrammierung 1
C SMTP-Host automatisch ermittlen Netzwerkprogrammierung 15
J Eclipse: Windows-Dienst auf fremden Host aktivieren Netzwerkprogrammierung 14
P Automatische Host suche im Netzwerk Netzwerkprogrammierung 3
thE_29 Host mittels IP bekommen? Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben