连接到没有注册表的RMI对象

时间:2010-06-09 09:40:29

标签: java ssh distributed rmi tunneling

我认为我需要连接到远程RMI对象而无需通过注册表,但我不知道如何。

我的情况是这样的:我正在实施一个简单的工作分配服务,其中包括一个经销商和多个工人。分发服务器有一个已注册的RMI对象,客户端连接到该对象以发送作业,工作人员可以连接以接受作业。

不幸的是,分销商和工作人员主机都在防火墙后面。为了到达分发服务器主机,我通过SSH隧道连接两个端口(一个用于注册表,一个用于分发器对象),因此我可以从防火墙外部访问注册表和分发服务器。为了完成这项工作,我必须在分发服务器JVM上设置“-Djava.rmi.server.hostname = localhost”,以便客户端连接到其本地隧道端口,而不是实际分发器主机上的端口,该端口被阻止。

这给工作人员带来了问题,因为他们需要直接连接到分发服务器,但由于“localhost”重定向,他们的行为类似于客户端,并尝试连接到自己主机上的端口,这不是可用,因为我不是在挖掘工人(这是不切实际的)。

现在,如果我可以通过提供主机名和端口直接连接到远程对象,我可以取消分发服务器上的注册表和“localhost”hack,并使工作人员正确连接。

我该怎么做?或者这个问题有不同的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我现在通过实现我自己的RMISocketFactory解决了这个问题,它连接到“localhost”而不是分发主机。通过RMISocketFactory.setSocketFactory在客户端上使用这个套接字工厂,我现在可以运行经销商和工人而不会有任何黑客攻击。在客户端上,我当然还需要SSH隧道。