Java RMI 连接使用哪个端口?

2022-09-01 16:41:03

我可以知道Java RMI连接使用什么端口吗?

如果要使用 RMI 连接将 Java 客户机应用程序连接到 Java 服务器应用程序,那么我需要在服务器计算机上打开哪个端口,以便客户机应用程序可以连接到它?

我想在服务器计算机中设置防火墙,但我不知道应该打开哪个端口。


答案 1

RMI通常不会在防火墙上工作,因为它使用不可预测的端口(它从1099开始,然后用随机端口运行)。

在这些情况下,您通常需要通过 HTTP 使用隧道 RMI,这里对此进行了很好的描述。


答案 2

到目前为止,所有的答案都是不正确的。注册表通常使用端口 1099,但您可以更改它。但这还不是故事的结局。远程对象也使用端口,而不一定是 1099。

如果在导出时未指定端口,RMI 将使用随机端口。因此,解决方案是在导出时指定端口号。这是一个需要在防火墙中打开的端口(如果有的话)。

  • 在远程对象扩展 的情况下,使用一些非零端口号调用其构造函数。UnicastRemoteObjectsuper(port)

  • 在它不扩展的情况下,请向 提供一个非零端口号。UnicastRemoteObjectUnicastRemoteObject.exportObject()

这有几个皱纹。

  • 如果您使用的是套接字工厂,则必须具有合理的实现才能使端口共享正常工作,即不仅仅依赖于通过 或 的对象标识。RMIServerSocketFactoryequals()==Object.equals()

  • 如果您没有提供服务器套接字工厂,或者您确实提供了一个合理的方法,但不能同时提供两者,则可以对所有远程对象使用相同的非零显式端口号,例如 后跟任意数量的 或 呼叫。equals()createRegistry(1099)super(1099)exportObject(..., 1099)


推荐