我正在编写一个需要远程绑定(bind)的应用程序,即将远程对象绑定(bind)到远程注册表。默认情况下,Java RMI 注册表仅在本地绑定(bind),仅绑定(bind)在同一 JVM/主机中的远程对象。
我见过一些绕过此方法的解决方案,它们创建一个远程接口(interface),该接口(interface)将获取一个远程对象,然后在本地绑定(bind) (SO link of this disucssion)。有没有更优雅的方法来解决这个问题?也许我应该尝试将 JNDI 与其他提供商一起使用??
最佳答案
这是一个 hack,但您可以尝试在服务器上设置端口转发,这样注册表的服务器端口就会以这样一种方式公开:所有通过它的请求看起来都是本地的。
使用 SSH 可以很容易地做到这一点。在服务器上,运行:
ssh localhost -N -L 1199:localhost:1099 -g
这不会运行命令 (-N
),但会在本地机器上的端口 1199 上打开一个监听套接字,该套接字将转发到本地主机上的端口 1099 (-L 1199 :localhost:1099
) 并且可以访问来自任何来源的连接 (-g
)。通过此隧道建立的连接将对端口 1099 上的服务器显示为来自本地主机。请注意,您还可以添加 -f
以使 SSH 在设置隧道后进入后台,在这种情况下,我建议还添加“-o ExitOnForwardFailure”以改进错误处理。
也应该可以使用 netcat 而不是 SSH 来执行此操作,后者会更简单、更高效,但我没有安装合适的 netcat 版本。如果安装了 socat,也可以使用它:
socat TCP-LISTEN:1199,fork TCP:localhost:1099
现在,我不知道这些选项是否足够。这将打开网络级访问,但 rmiregistry 服务器可能仍会拒绝注册远程对象。不过,我对此表示怀疑。
关于java - 远程 RMI 注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903508/