我可以知道Java RMI连接使用的端口是什么吗?
如果我想使用RMI连接将Java客户端应用程序连接到Java服务器应用程序,我需要在服务器机器上打开哪个端口,以便客户端应用程序可以连接到它?
我想在服务器机器上设置防火墙,但我不知道该打开哪个端口。
我可以知道Java RMI连接使用的端口是什么吗?
如果我想使用RMI连接将Java客户端应用程序连接到Java服务器应用程序,我需要在服务器机器上打开哪个端口,以便客户端应用程序可以连接到它?
我想在服务器机器上设置防火墙,但我不知道该打开哪个端口。
RMI通常不能通过防火墙工作,因为它使用不可预测的端口(它从1099开始,然后在此之后运行到随机端口)。
在这种情况下,通常需要使用HTTP隧道来传输RMI,这在这里有很好的描述。
默认情况下,RMI注册表使用1099端口。
客户端和服务器(存根、远程对象)通过随机端口通信,除非在导出远程对象时指定了固定端口。通信是通过使用0作为起始端口的套接字工厂启动的,这意味着使用1到65535之间的任何可用端口。
通常使用rmiregistry命令在服务器上设置端口。您可以在命令行上设置端口,否则将默认为1099。
ServerApi server = (ServerApi) registry.lookup(ServerApi.RMI_NAME);
System.out.println("Got server handle " + server);
将会产生类似以下的结果:
获得服务器句柄 Proxy[ServerApi,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:172.17.3.190:9001,objID:[-7c63fea8:...
在这里您可以看到端口号为 9001。如果远程类没有指定端口,则它会在重启后更改。如果您想使用固定的端口,则需要确保远程类构造函数执行以下操作:
super(rmiPort)
取决于您如何实现RMI,您可以设置注册表端口(注册表是“服务的唯一点”)。如果您没有设置显式端口,则注册表将默认使用1099端口。在某些情况下,您可能会遇到防火墙问题,防火墙不允许您的rmi-client看到注册表后面的存根和对象,因为这些东西运行在随机端口上,与注册表使用的不同端口,并且该端口被防火墙阻止 - 当然了。
如果您使用RmiServiceExporter
来配置您的RmiServer,则可以使用方法rmiServiceExporter.setServicePort(port)
来固定rmi端口,并在防火墙中打开此端口。
编辑:我通过这篇文章解决了这个问题:http://www.mscharhag.com/java/java-rmi-things-to-remember
UnicastRemoteObject.UnicastRemoteObject()
构造函数和 UnicastRemoteObject.exportObject()
中的 port
参数。RmiServiceExporter
是 Spring 的一部分,而不是 Java RMI。 - user207421端口在这里可用:java.rmi.registry.Registry.REGISTRY_PORT
(1099)
参考其他答案,这是我的看法 -
客户端和服务器端都涉及到端口。
对于服务器/远程端,如果您导出对象而不提供端口,则远程对象将使用随机端口进行侦听。
当客户端查找远程对象时,它总是在其一侧使用随机端口,并将连接到上述列出的远程对象端口。
-Dcom.sun.management.jmxremote.rmi.port=7091
来解决问题。请参考以下博客文章:http://hirt.se/blog/?p=289 - gm3dmo