将RMI限制为一个端口的含义

我希望能够将我的应用程序使用的端口限制为一些尽可能小的已知集。 该应用程序使用Java RMI与远程服务器通信。 注册表在端口1099上导出,这是标准的。 但是,看起来用于导出各种远程对象的端口并不总是一致的,尽管它在短时间内在多个连接中保持相同。 我没有受过教育的猜测是,在幕后进行的某种服务器套接字的缓存导致了这种情况。

我希望能够确保连接总是在几个众所周知的端口上发生,因此安装客户端应用程序的用户必须在防火墙中打开尽可能少的端口。 似乎我可以通过将RMISocketFactory更改为自定义实现并覆盖createServerSocket方法以始终使用已知端口来实现此目的。 但是,这提出了一些问题:

  • 这对可扩展性有何影响? 如果我知道一次只能连接一个人,但是它不会阻止多个同时连接,这听起来很棒吗?
  • 是否可以将这些远程对象与注册表绑定在同一端口上? 我的直觉说不,因为端口已经被createRegistry调用绑定了。
  • 还有其他我不知道的含义吗?

它不会阻止多个同时连接?

没有。

是否可以将这些远程对象与注册表绑定在同一端口上? 我的直觉说不,因为端口已经被createRegistry()调用绑定了。

是的,只要您通过LocateRegistry.createRegistry()在同一个JVM中启动注册表,并且只要涉及的任何服务器套接字工厂都equal()

还有其他我不知道的含义吗?

根本没有任何影响。 RMI使用空或相等的服务器套接字工厂在远程对象之间进行端口共享,TCP在同一端口的多个连接之间进行端口共享。