it-swarm.com.de

Welcher Port wird von der Java-RMI-Verbindung verwendet?

Kann ich wissen, welchen Port die Java-RMI-Verbindung verwendet?

Wenn ich eine Java-Clientanwendung über eine RMI-Verbindung mit einer Java-Serveranwendung verbinden möchte, welchen Port muss ich auf dem Servercomputer öffnen, damit die Clientanwendung eine Verbindung herstellen kann?

Ich möchte eine Firewall auf der Server-Maschine einrichten, weiß jedoch nicht, welchen Port ich öffnen soll.

16
kwc

RMI funktioniert im Allgemeinen nicht über eine Firewall, da es unvorhersehbare Ports verwendet (es beginnt mit 1099 und läuft danach mit einem zufälligen Port ab).

In diesen Situationen müssen Sie im Allgemeinen auf das RMI-Tunneling über HTTP tunneln, was hier gut beschrieben wird.

22
skaffman

In RMI gibt es zwei Ports, die sich auf Ports beziehen: 

1) Die RMI-Registry verwendet standardmäßig Port 1099

2) Client und Server (Stubs, Remote-Objekte) kommunizieren über zufällige Ports, sofern beim Exportieren eines Remote-Objekts kein fester Port angegeben wurde. Die Kommunikation wird über eine Socket-Factory gestartet, die 0 als Startport verwendet. Dies bedeutet, "jeden verfügbaren Port verwenden" zwischen 0 und 65535.

10
Kai Sternad

Alle bisherigen Antworten sind falsch. Die Registry verwendet normalerweise Port 1099, Sie können ihn jedoch ändern. Aber das ist nicht das Ende der Geschichte. Remote-Objekte verwenden auch Ports und nicht unbedingt 1099.

Wenn Sie beim Exportieren von keinen Port angeben, verwendet RMI einen zufälligen Port. Die Lösung ist daher, eine Portnummer beim Exportieren von anzugeben. Und dies ist ein Port, der ggf. in der Firewall geöffnet werden muss.

  • Wenn Ihr Remote-Objekt UnicastRemoteObject erweitert, rufen Sie den Konstruktor super(port) mit einer nicht-null-Portnummer auf.

  • Falls UnicastRemoteObject nicht erweitert wird, geben Sie eine UnicastRemoteObject.exportObject()-Portnummer an, die nicht Null ist.

Hier gibt es mehrere Falten.

  • Wenn Sie keine Socket-Factorys verwenden und beim Exportieren des ersten Remote-Objekts eine Portnummer angeben, die nicht null ist, teilt RMI diesen Port automatisch mit anschließend exportierten Remote-Objekten ohne angegebene Portnummern oder mit der Angabe Null auf. Dieses erste Remote-Objekt enthält eine mit LocateRegistry.createRegistry(). erstellte Registry. Wenn Sie also eine Registry für Port 1099 erstellen, können alle anderen Objekte, die von dieser JVM exportiert werden, Port 1099 gemeinsam nutzen.

  • Wenn Sie sind Socketfabriken verwenden und Ihre RMIServerSocketFactory eine sinnvolle Implementierung von equals() hat, gilt dasselbe wie oben.

  • Unter beiden Bedingungen können Sie dieselbe explizite Nicht-Null-Portnummer für alle Remote-Objekte verwenden, z. createRegistry(1099), gefolgt von einer beliebigen Anzahl von super(1099)- oder exportObject(..., 1099)-Aufrufen.

8
user207421

Sie legen den Port auf dem Server normalerweise mit dem Befehl rmiregistry fest. Sie können den Port in der Befehlszeile festlegen, oder der Standardwert ist 1099

3
El Guapo

Wenn Sie den Client ändern können, lassen Sie ihn die Remote-Referenz ausdrucken, und Sie sehen, welchen Port er verwendet. Z.B.

ServerApi server = (ServerApi) registry.lookup(ServerApi.RMI_NAME);
System.out.println("Got server handle " + server);

wird etwas produzieren wie:

Server-Handler-Proxy erhalten [ServerApi, RemoteObjectInvocationHandler [UnicastRef [liveRef: [Endpunkt: 172.17.3.190: 9001, objID: [- 7c63fea8: ...

wo Sie sehen, dass der Port 9001 ist. Wenn die Remote-Klasse den Port nicht angibt, ändert sich der Port bei Neustarts. Wenn Sie einen festen Port verwenden möchten, müssen Sie sicherstellen, dass der Konstruktor der Remote-Klasse Folgendes ausführt:

super(rmiPort)
2
Leo Dagum

Abhängig davon, wie Sie das RMI implementieren, können Sie den Registrierungsport festlegen (die Registrierung ist ein "eindeutiger Punkt für Dienste"). Wenn Sie keinen expliziten Port festlegen, nimmt die Registrierung standardmäßig den Port 1099 an. In einigen Fällen haben Sie eine Firewall, und die Firewall lässt Ihrem rmi-client nicht die Stubs und Objekte hinter der Registrierung zu, da diese Dinge zufällig ausgeführt werden, einen anderen Port, den die Registry verwendet, und diesen Port wird natürlich durch die Firewall blockiert. Wenn Sie Ihren RmiServer mit RmiServiceExporter konfigurieren, können Sie die Methode rmiServiceExporter.setServicePort(port) verwenden, um den Rmi-Port zu reparieren, und diesen Port in der Firewall öffnen.

Bearbeiten: Ich behebe dieses Problem mit diesem Beitrag: http://www.mscharhag.com/Java/java-rmi-things-to-remember

0
Marco Blos

In Bezug auf andere Antworten oben, hier ist meine Ansicht -

sowohl auf der Client- als auch auf der Serverseite gibt es Ports.

  • wenn Sie für Server/Remote-Seite das Objekt exportieren, ohne einen Port anzugeben, verwendet das Remote-Objekt einen zufälligen Port zum Abhören.

  • wenn ein Client nach dem Remote-Objekt sucht, verwendet er immer einen zufälligen Port auf seiner Seite und stellt eine Verbindung zum Remote-Objekt-Port her (siehe oben).

0
Nrj