Jaki port jest używany przez połączenie Java RMI?

Czy Mogę wiedzieć jaki port jest używany przez połączenie Java RMI?

Jeśli chcę połączyć aplikację kliencką Java z aplikacją serwerową Java za pomocą połączenia RMI, jaki port muszę otworzyć na maszynie serwerowej, aby aplikacja kliencka mogła się z nią połączyć?

Chcę skonfigurować firewall na serwerze, ale nie wiem, który port powinienem otworzyć.

Author: Ashan, 2010-06-18

9 answers

RMI zazwyczaj nie działa przez firewall, ponieważ używa nieprzewidywalnych portów(zaczyna się na 1099, a następnie uruchamia się z przypadkowym portem).

W takich sytuacjach zazwyczaj trzeba uciekać się do tunelowania RMI przez HTTP, co jest dobrze opisane tutaj.

 22
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 03:12:20

W RMI, w odniesieniu do portów istnieją dwa odrębne mechanizmy:

1) domyślnie rejestr RMI używa portu 1099

2) klient i serwer (stuby, zdalne obiekty) komunikują się przez losowe porty, chyba że podczas eksportowania zdalnego obiektu podano stały port. Komunikacja jest uruchamiana przez fabrykę gniazd, która używa 0 jako portu startowego, co oznacza "użyj dowolnego portu, który jest dostępny" między 0 a 65535.

 10
Author: Kai Sternad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-14 08:15:39

Wszystkie odpowiedzi do tej pory są błędne. Rejestr zwykle używa portu 1099, ale można go zmienić. Ale to nie koniec historii. Zdalne obiekty również używają portu, a niekoniecznie 1099.

Jeśli nie określisz portu podczas eksportu , RMI użyje portu losowego. Rozwiązaniem jest zatem podanie numeru portu przy eksporcie . I jest to port, który wymaga otwarcia w firewallu, jeśli w ogóle.

  • W przypadku, gdy zdalny obiekt extends UnicastRemoteObject, posiada wywołanie konstruktora {[1] } z niezerowym numerem portu.

  • W przypadku, gdy nie rozszerza UnicastRemoteObject, podaj niezerowy numer portu UnicastRemoteObject.exportObject().

Istnieje kilka zmarszczek do tego.

  • Jeśli nie używasz fabryk gniazd, a podczas eksportowania pierwszego zdalnego obiektu podasz niezerowy numer portu, RMI automatycznie udostępni ten port eksportowanym obiektom zdalnym bez określonego portu liczby, lub określenie zera. Ten pierwszy zdalny obiekt zawiera rejestr utworzony za pomocą LocateRegistry.createRegistry()., więc jeśli utworzysz Registry na porcie 1099, wszystkie inne obiekty wyeksportowane z tego JVM mogą współdzielić port 1099.

  • Jeśli używasz fabryk gniazd, a RMIServerSocketFactory ma sensowną implementację equals(), to to samo dotyczy powyższego.

  • W obu warunkach można użyć tego samego niezerowego jawnego numeru portu dla wszystkich zdalnych obiektów, np. createRegistry(1099), po którym następuje dowolny liczba połączeń super(1099) lub exportObject(..., 1099).

 7
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 03:11:28

Zazwyczaj ustawiasz port na serwerze za pomocą polecenia rmiregistry. Możesz ustawić port w wierszu poleceń, lub domyślnie będzie to 1099

 3
Author: El Guapo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-18 16:23:23

Jeśli możesz zmodyfikować klienta, poproś go o wydrukowanie zdalnego odniesienia, a zobaczysz, jakiego portu używa. Np.

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

Wyprodukuje coś w stylu:

Got server handle Proxy[ServerApi,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:172.17.3.190:9001,objID:[-7c63fea8:...

Gdzie można zobaczyć port jest 9001. Jeśli zdalna klasa nie określa portu, to zmieni się w trakcie restartów. Jeśli chcesz użyć stałego portu to potrzebujesz aby upewnić się, że konstruktor zdalnej klasy robi coś w stylu:

super(rmiPort)
 2
Author: Leo Dagum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-10 22:14:47

W zależności od tego, jak zaimplementujesz RMI, możesz ustawić port rejestru (rejestr jest "unikalnym punktem usług"). Jeśli nie ustawisz jawnego portu, rejestr domyślnie przyjmie port 1099. W niektórych przypadkach masz zaporę sieciową, a zapora sieciowa nie pozwala klientowi rmi na zobaczenie stubów i obiektów znajdujących się za rejestrem, ponieważ te rzeczy działają w losowo wybranym porcie, innym porcie używanym przez rejestr, a ten port jest blokowany przez zaporę sieciową - oczywiście. Jeśli używasz RmiServiceExporter do skonfiguruj serwer RmiServer, możesz użyć metody rmiServiceExporter.setServicePort(port), aby naprawić port rmi i otworzyć ten port w zaporze.

Edit: rozwiązuję ten problem tym postem: http://www.mscharhag.com/java/java-rmi-things-to-remember

 0
Author: Marco Blos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 23:45:59

W odniesieniu do innych odpowiedzi powyżej, oto mój pogląd -

Istnieją porty po stronie klienta i serwera.

  • Po stronie serwera/zdalnego, jeśli wyeksportujesz obiekt bez podania portu , zdalny obiekt użyje losowego portu do nasłuchu.

  • Klient, gdy wyszukuje zdalny obiekt, zawsze używa losowego portu po jego stronie i połączy się z portem zdalnego obiektu, jak wymieniono powyżej.

 0
Author: Nrj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 12:11:08

Port jest dostępny tutaj: java.rmi.registry.Registry.REGISTRY_PORT (1099)

 -1
Author: kevinarpe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-16 09:51:30

Z javadoc z java.rmi.registry.Registry

Dlatego zdalna implementacja rejestru jest zazwyczaj eksportowana ze znanym adresem, na przykład ze znanym ObjID oraz numer portu TCP (domyślnie jest 1099).

Zobacz więcej w javadoc z java.rmi.registry.LocateRegistry.

 -1
Author: Paul Vargas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 20:40:39