我有一个TCP / RMI服务器与运行Apache tomcat的Web服务器通信,所有信息,例如客户都存储在TCP / RMI服务器上。这些都是在java(tcp套接字,Java RMI,servlet,JavaBeans,JSP,comet)中完成的。
两台服务器之间的通信由RMI完成。
Web客户端向http Web服务器发出请求,http服务器将它们转发到服务器TCP / RMI。到目前为止一切都很好。
问题是反向通信,服务器TCP / RMI到Web服务器。由于服务器之间的连接是由RMI执行的,您可以通过Web服务器发送回调,就像客户端和服务器rmi之间的异步通信一样?
此致 安德烈
答案 0 :(得分:-1)
通过提供服务器可以调用的回调对象,可以进行双向通信。您也可以只运行2个RMI服务器。 TCP服务器上有1个,Tomcat上有另外1个。因此也创建了双向通信链路。您可以使用静态方法和contextlistener在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;
}
}