【问题标题】:Interoperability between webserver RMI网络服务器 RMI 之间的互操作性
【发布时间】:2012-01-17 12:48:17
【问题描述】:

我有一个 TCP/RMI 服务器来与运行 Apache tomcat 的 Web 服务器通信,所有信息,例如客户,都存储在 TCP/RMI 服务器上。这都是在 java 中完成的(tcp 套接字、Java RMI、servlet、JavaBeans、JSP、comet)。

两台服务器之间的通信由 RMI 完成。

Web 客户端向 http Web 服务器发出请求,该服务器将它们转发到服务器 TCP / RMI。到目前为止一切顺利。

问题是反向通信,服务器 TCP/RMI 到 web 服务器。由于服务器之间的连接是由 RMI 执行的,因此您可以像在客户端和服务器 rmi 之间进行异步通信一样,通过 Web 服务器发送回调?

问候, 安德烈

【问题讨论】:

    标签: java servlets rmi


    【解决方案1】:

    通过提供服务器可以调用的回调对象,可以进行 2 路通信。您也可以,只运行 2 个 RMI 服务器。 1 在您的 TCP 服务器上,另外 1 在您的 Tomcat 上。因此也创建了双向通信链路。您可以使用静态方法和上下文侦听器在 TomCat 上启动 RMI 服务器。

    我目前正在从事一个类似的项目,包括 Glassfish、RMI 双向通信、Comet 等。这是我在 Web 应用程序中的 RMI 服务器类。可能会给你一些启发。

    package RMI.WS;
    
    import ILWS.Controller.Comet.CometServlet;
    import Logging.DSLogger;
    import RMI.DSRMI;
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    
    /**
     *
     * @author roy
     */
    public class RMIServer implements Runnable {
    
        private static final String rmiPath = "ILWServlet";
        private static final String ClientrmiPath = "ILDS";
        private static RemoteInteractor interactor;
        private static DSRMI rmiClient;
        private static RMIServer rmi;
        private static int rmiPort;
    
        public static void startRMI() {
            rmiPort = 6666;
            try {
                interactor = new RemoteInteractor();
                LocateRegistry.createRegistry(rmiPort).rebind(rmiPath, interactor);
                DSLogger.Debug(RMIServer.class, "creating new RMI Registry");
            } catch (Exception ex) {
                DSLogger.Log(RMIServer.class, ex.getMessage());
            }
        }
    
        public static void stopRMI() {
            try {
                LocateRegistry.getRegistry("127.0.0.1", rmiPort).unbind("ILWServlet");
                DSLogger.Debug(RMIServer.class, "removing RMI Registry");
            } catch (Exception ex) {
                DSLogger.throwableLog(RMIServer.class, ex);
            }
        }
    
        public static DSRMI getClientRMI() {
            if (rmiClient == null) {
                try {
                    rmiClient = (DSRMI) LocateRegistry.getRegistry("127.0.0.1", 6665).lookup(ClientrmiPath);
                } catch (NotBoundException ex) {
                    DSLogger.throwableLog(RMIServer.class, ex);
                } catch (Exception ex) {
                    DSLogger.throwableLog(RMIServer.class, ex);
                }
            }
            return rmiClient;
        }  
    }
    

    【讨论】:

    • 如果您向服务器发送回调(从客户端到服务器的远程引用),则可以在双方进行周四 Rmi 通信。
    • 这个答案完全不正确。客户端可以导出服务端可以调用的回调对象。
    • EJP,能否请您提供一个示例?
    • @rkokkelk 该示例只是在客户端创建的远程对象。将其作为参数传递给服务器,将远程接口指定为形式参数类型。然后服务器可以调用该对象上的远程方法,当然防火墙和 Internet 允许。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2011-03-16
    • 2013-06-08
    相关资源
    最近更新 更多