java - 远程 RMI 注册表

标签 java rmi jndi naming

我正在编写一个需要远程绑定(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/

相关文章:

java - 仅在 Intellij-Idea 中查找特定类的方法用法

java - NullPointerException 尝试获取 Google App Engine 中实体中的字段值时出现异常

java - 我为什么/如何收到错误 : NoClassDefFoundError: org/springframework/aop/framework/ProxyFactory

java - RMI 对象未刷新

java - 是否可以从 javax.naming.InitialContext 获取 "everything"?

java - Junit 在应用服务器外测试 JNDI InitialContext

sql-server - 尝试访问 Tomcat 服务器上的 JNDI 源

java - 解决java嵌入式SQL数据库中的排他关系

java - 在 JAVA 中使用 PKCS #7 签署数据

带有 Scala 的 Java RMI,这可能吗?