puertos puerto predefinido conexion cambiar 11g java connection rmi firewall

java - predefinido - puertos oracle



¿Qué puerto utiliza la conexión Java RMI? (9)

Con referencia a otras respuestas anteriores, aquí está mi opinión:

Hay puertos involucrados tanto en el lado del cliente como del servidor.

  • para el servidor / lado remoto, si exporta el objeto sin proporcionar un puerto, el objeto remoto usará un puerto aleatorio para escuchar.

  • un cliente, cuando busca el objeto remoto, siempre usará un puerto aleatorio en su lado y se conectará al puerto del objeto remoto como se indica anteriormente.

¿Puedo saber qué puerto utiliza la conexión Java RMI?

Si quiero conectar una aplicación de cliente Java a una aplicación de servidor Java mediante una conexión RMI, ¿qué puerto necesito abrir en la máquina del servidor para que la aplicación cliente pueda conectarse a ella?

Quiero configurar un firewall en la máquina del servidor, pero no sé qué puerto debo abrir.


Depende de cómo implemente el RMI, puede configurar el puerto de registro (el registro es un "punto único de servicios"). Si no establece un puerto explícito, el registro asumirá el puerto 1099 de forma predeterminada. En algunos casos, tiene un servidor de seguridad y el servidor de seguridad no permite que su rmi-client vea los apéndices y los objetos detrás del registro, porque estas cosas se ejecutan en un puerto aleatorio, un puerto diferente que usa el registro, y este puerto Está bloqueado por un cortafuegos, por supuesto. Si usa RmiServiceExporter para configurar su RmiServer, puede usar el método rmiServiceExporter.setServicePort(port) para arreglar el puerto rmi y abrir este puerto en el firewall.

Edición: resuelvo este problema con esta publicación: http://www.mscharhag.com/java/java-rmi-things-to-remember


Desde el javadoc de java.rmi.registry.Registry

Por lo tanto, la implementación de un objeto remoto del registro se suele exportar con una dirección conocida, como con un número de puerto ObjID y TCP conocido (el valor predeterminado es 1099 ).

Ver más en el javadoc de java.rmi.registry.LocateRegistry .


El puerto está disponible aquí: java.rmi.registry.Registry.REGISTRY_PORT (1099)


En RMI, con respecto a los puertos hay dos mecanismos distintos involucrados:

1) Por defecto, el registro de RMI usa el puerto 1099

2) El cliente y el servidor (stubs, objetos remotos) se comunican a través de puertos aleatorios a menos que se haya especificado un puerto fijo al exportar un objeto remoto. La comunicación se inicia a través de una fábrica de zócalos que usa 0 como puerto de inicio, lo que significa "usar cualquier puerto que esté disponible" entre 0 y 65535.


Normalmente, configura el puerto en el servidor mediante el comando rmiregistry. Puede configurar el puerto en la línea de comando, o por defecto será 1099


Por lo general, RMI no funciona con un firewall, ya que utiliza puertos impredecibles (comienza en 1099 y luego se ejecuta con un puerto aleatorio).

En estas situaciones, generalmente debe recurrir a la tunelización de RMI a través de HTTP, que se describe bien here .


Si puede modificar el cliente, pídale que imprima la referencia remota y verá qué puerto está usando. P.ej

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

producirá algo como:

El servidor consiguió el Proxy [ServerApi, RemoteObjectInvocationHandler [UnicastRef [liveRef: [endpoint: 172.17.3.190: 9001, objID: [- 7c63fea8: ...

donde puede ver que el puerto es 9001. Si la clase remota no especifica el puerto, cambiará en los reinicios. Si desea usar un puerto fijo, debe asegurarse de que el constructor de la clase remota haga algo como:

super(rmiPort)


Todas las respuestas hasta ahora son incorrectas. El registro normalmente utiliza el puerto 1099, pero puede cambiarlo. Pero ese no es el final de la historia. Los objetos remotos también usan puertos, y no necesariamente 1099.

Si no especifica un puerto al exportar , RMI usa un puerto aleatorio. Por lo tanto, la solución es especificar un número de puerto al exportar . Y este es un puerto que necesita abrirse en el firewall, si lo hay.

  • En el caso de que su objeto remoto se extienda a UnicastRemoteObject , su constructor se llama super(port) con un número de puerto distinto de cero.

  • En el caso de que no extienda UnicastRemoteObject , proporcione un número de puerto distinto de cero a UnicastRemoteObject.exportObject() .

Hay varias arrugas a esto.

  • Si no está utilizando fábricas de zócalos y proporciona un número de puerto distinto de cero al exportar su primer objeto remoto, RMI compartirá automáticamente ese puerto con los objetos remotos exportados posteriormente sin los números de puerto especificados, o especificando cero. El primer objeto remoto incluye un registro creado con LocateRegistry.createRegistry(). Entonces, si crea un Registry en el puerto 1099, todos los demás objetos exportados desde esa JVM pueden compartir el puerto 1099.

  • Si está utilizando fábricas de sockets y su RMIServerSocketFactory tiene una implementación razonable de equals() , se aplica lo mismo que anteriormente.

  • Bajo ambas condiciones, puede usar el mismo número de puerto explícito distinto de cero para todos los objetos remotos, por ejemplo, createRegistry(1099) seguido de cualquier número de llamadas super(1099) o exportObject(..., 1099) .