有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Tomcat隧道RMI

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

有关于这方面的分步指南吗?还是只在服务器上安装一个war文件

谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    除此之外,还有一个so-so guide here。它适用于Tomcat 3,但概念仍然相同,并且它提到了与Apache的集成,这对于Servlet的使用是非常冗余的,因此如果您已经非常熟悉Tomcat,那么可以忽略其中的部分内容

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


    根据评论进行编辑:

    I've found a servlet that will mimic /cgi-bin/java-rmi.cgi but to use it I have to direct all requests to /RMIServlet without letting the client know that it is being redirected. I googled a lot for this and tried numerous solution. All without success. What's the best way to do this?

    我认为这是通过向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()
    );