1

我想将 RMI 设置为通过 java servlet 上的端口 80 ..(通过防火墙)我有一个 Tomcat 服务器,我正在寻找能够捕获 RMI http 请求并将其传递给服务器机器上的 RMI 层。我读过 RMI 会自动处理它。

有分步指南吗?或者只是一个要安装在服务器上的战争文件?

谢谢。

4

1 回答 1

3

我们已经在生产服务器上完成了这项工作,但那是很久以前的事了。没有要安装的战争文件,因为这是一件非常不寻常的事情,尤其是现在使用 AJAX 和支持 Web 的应用程序等等。出于可扩展性和可靠性的原因,我不建议在 Internet 上部署 RMI。它在 LAN 甚至 JVM 上都很棒,但在更广泛的范围内,如果可能的话,我会考虑使用更传统的 Web 服务。

除此之外,这里有一个马马虎虎的指南。它适用于 Tomcat 3,但概念仍然相同,并且它提到了与 Apache 的集成,这对于 Servlet 的使用来说是非常多余的,所以如果你已经对 Tomcat 非常熟悉,可以忽略其中的一些内容。

它将指导您在 Tomcat 中安装一个 servlet,该 servlet 将解压一个依赖于 HTTP Post 的 RMI 请求,找到本地注册表并为您完成远程方法调用。它还提供了一个小的演示服务器和客户端应用程序来测试您的设置。


根据评论进行编辑:

我找到了一个 servlet,它可以模仿 /cgi-bin/java-rmi.cgi 但要使用它,我必须将所有请求定向到 /RMIServlet 而不让客户端知道它正在被重定向。我为此搜索了很多,并尝试了许多解决方案。都没有成功。最好的方法是什么?

我认为这是通过向 RMI 提供一个 SocketFactory 来完成的,该 SocketFactory 放弃了通常的端口 1099 路由,而是在 HTTP/Post 上捎带请求。

套接字工厂本身是这样的:您可以通过更改 URL 对象使其与 HTTPS 一起使用。

public class RMIHttpToCgiSocketFactory extends RMISocketFactory implements Serializable {
    public static final long serialVersionUID = 1L;

    public RMIHttpToCgiSocketFactory(){}

    public Socket createSocket( String s, int i ) throws IOException {
        // Whacked out indentation for StackOverflow! Hope you can read this.
        return new HttpsSendSocket( 
            s, 
            i,
            new URL(
                "http", 
                s, 
                "/cgi-bin/java-rmi.cgi?forward="+i
            )
        );
    }

    public ServerSocket createServerSocket( int i ) {
        return null;
    }
}

现在你只需要告诉你的应用程序在它的 RMI 处理中使用这个套接字工厂。在我们的代码库中,这是在服务器和客户端上完成的。在服务器端,当您的 RMI 服务将自身绑定到注册表时,您可以在导出对象以获取远程存根时指定客户端套接字工厂。

RMIClientSocketFactory clientSocketFactory = new RMIHttpToCgiSocketFactory();
Remote stub = UnicastRemoteObject.exportObject( 
    server, 
    port, 
    clientSocketFactory, 
    RMISocketFactory.getDefaultSocketFactory() 
);

在客户端上,您可以在查找注册表时指定套接字工厂。

Registry registry = LocateRegistry.getRegistry(
    loginHostName, 
    portNumber, 
    new RMIHttpToCgiSocketFactory()
);
于 2009-07-17T08:00:08.807 回答