如何确保RMI仅使用一组特定的端口?

Bob*_*oss 8 java rmi

在我们的应用程序中,我们使用RMI以非常不同的方式进行客户端 - 服务器通信:

  1. 将数据从服务器推送到客户端以进行显示.
  2. 从客户端向服务器发送控制信息.
  3. 来自那些控制消息的回调代码从服务器返回到客户端的路径(侧边栏注释 - 这是一些遗留代码的副作用,而不是我们的长期意图).

我们想要做的是确保我们所有与RMI相关的代码仅使用已知的指定端口库存.这包括注册表端口(通常预期为1099),服务器端口以及回调产生的任何端口.

这是我们已经知道的:

  1. LocateRegistry.getRegistry(1099)或Locate.createRegistry(1099)将确保注册表正在监听1099.
  2. 将UnicastRemoteObject构造函数/ exportObject静态方法与port参数一起使用将指定服务器端口.

这些Sun论坛帖子也涵盖了这些要点.

我们不知道的是:我们如何确保回调产生的客户端连接回服务器只能连接到指定的端口,而不是默认为匿名端口?

编辑:添加了一个很长的答案,总结了我的发现以及我们如何解决问题.希望这可以帮助其他有类似问题的人.

第二次编辑:事实证明,在我的应用程序中,我在创建和修改套接字工厂时似乎存在竞争条件.我曾希望允许用户在Beanshell脚本中覆盖我的默认设置.遗憾的是,在工厂创建第一个套接字后,我的脚本似乎正在运行.因此,我从默认设置和用户设置中获得了混合端口.需要做更多的工作,这超出了这个问题的范围,但我想我会指出它是其他可能不得不在某些时候踏上这些水域的人的兴趣点....

Dav*_*ebb 4

您可以使用自定义 RMI 套接字工厂来完成此操作。

套接字工厂创建供 RMI 在客户端和服务器端使用的套接字,因此如果您编写自己的套接字,您就可以完全控制所使用的端口。客户端工厂在服务器上创建,序列化,然后发送到客户端,这非常简洁。

这是 Sun 的指南,告诉您如何操作。