【问题标题】:How to set static client port for rmi clients?如何为 rmi 客户端设置静态客户端端口?
【发布时间】:2016-05-09 07:17:38
【问题描述】:

我需要一种为 rmi 客户端设置静态端口的方法。服务器使用固定端口进行连接,但客户端创建了一个动态端口,尽管我设置了客户端套接字工厂。

我发现的根本原因是在“TCPChannel”类中。在这堂课中,我看到了这段代码:

TCPEndpoint.getLocalEndpoint(0, (RMIClientSocketFactory)null, (RMIServerSocketFactory)null);

这显然行不通,因为这段代码不知道我的套接字工厂。显然这个类不是 RMI 特定的。

问题是 - 有没有办法覆盖 tcp 套接字创建,使其根本不创建动态端口?

【问题讨论】:

  • 为什么?您想在这里解决什么问题?

标签: java rmi


【解决方案1】:

虽然我设置了客户端套接字工厂,但客户端创建了一个动态端口。

你是怎么设置的?不管你做了什么,你都没有做对。

但是为什么要这样做呢?有很多缺点。一方面,它会导致来自该客户端的所有 RMI 调用都按顺序进行,可能以两分钟为间隔,或者可能导致任何更频繁的调用以BindExceptions 失败。

另一方面,它可能对 DGC 产生不利影响。

而且没有任何实际的好处。

显然这个类不是 RMI 特定的。

什么课?它有什么明显的地方?

【讨论】:

  • 像这样设置客户端套接字工厂:RMISocketFactory.setSocketFactory(new RMIClientSocketFactoryWithSocketAdaptor(opts)); RMIClientSocketFactoryWithSocketAdaptor 是我对套接字工厂的实现。我们必须将静态端口作为限制任何动态未知端口打开的安全要求的一部分。我指的不是 RMI 特定的类是“TCPChannel”。
  • 这已经过时了 18 年。现代的方法是在服务器上导出对象时提供RMIClientSocketFactory,这也意味着它必须是可序列化的。 TCPChannel 是 100% RMI 特定的,不用于其他目的。您收到的安全要求是 100% 没有意义的,应该由有能力的人进行审查。仅仅因为您可以为出站端口制定防火墙规则,NOT 就意味着这是一个好主意。它不是。近 20 年来,我一直在这里和其他地方这么说,我从未见过任何反驳或反例。
猜你喜欢
  • 2013-10-27
  • 2011-03-27
  • 2013-12-09
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多