我已经深入搜索了论坛,但我找不到我的这个问题的答案,所以我希望你们能给我一些反馈。
我是一名学生,目前正在部署基于网络的RMI系统作为任务。我正在使用Eclipse EE Java IDE。
我的服务器非常简单:
package server;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import controlador.Controlador;
import tda.TDAManejoDatos;
public class Server {
TDAManejoDatos objetoRemoto;
public static void main(String[] args)
{
new Server();
}
public Server() {
iniciar();
}
public void iniciar() {
try {
LocateRegistry.createRegistry(1098);
TDAManejoDatos controladorRemoto = Controlador.getControlador();
Naming.rebind ("//localhost/TPOAD_Servidor", controladorRemoto);
System.out.println("//localhost/TPOAD_Servidor");
} catch (Exception e) {
e.printStackTrace();
}
}
}
您可能已经猜到, TDAManejoDatos 是我的远程接口。
客户端是 .jsp 页面,我目前正在使用 Tomcat 7 。
此 .jsp 页面有一个表单,该表单将某些数据提交给 servlet 。所以就此而言,我在doPost()中有一个方法可以做到这一点:
request.setAttribute("mozo", Server.getInstance().loginMozo(
request.getParameter("user"),
request.getParameter("password"))
);
因此,数据被转发到“客户端服务器”,这实际上是一个充当真实服务器和客户端之间的中间层的类。这样做的唯一目的就是将远程服务器从客户端隐藏起来,因此它“认为”所有方法都是在本地调用的。换句话说,它隐藏了客户端的远程复杂性。
是的,这个类也被称为“服务器”,但它与我首先向您展示的“真实”服务器完全不同。
package controladorRemoto;
import java.rmi.Naming;
import java.rmi.RemoteException;
import javax.security.auth.login.LoginException;
import tda.TDAManejoDatos;
import DTOs.MozoDTO;
public class Server {
private static Server instance;
private TDAManejoDatos server;
private Server(){
getStub();
}
public static Server getInstance(){
if(instance==null)
instance = new Server();
return instance;
}
private boolean getStub() {
try {
server = (TDAManejoDatos)Naming.lookup("//localhost/TPOAD_Servidor");
return true; //Si devuelve verdadero se pudo conectar y encontrar la referencia al objeto.
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public MozoDTO loginMozo(String user, String password) {
MozoDTO mozo = null;
try {
mozo = server.loginMozo(user, password);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LoginException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mozo;
}
}
问题出在哪里。即使服务器已启动并运行,我的 getStub()函数每次都会失败,并出现此错误:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: tda.TDAManejoDatos (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at controladorRemoto.Server.getStub(Server.java:33)
at controladorRemoto.Server.<init>(Server.java:20)
at controladorRemoto.Server.getInstance(Server.java:25)
at servlet.Servlet.doPost(Servlet.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我不知道这个ClassNotFound异常是什么,因为我的界面设置在那里。此外,我过去已经成功部署了其他RMI系统,但这是我第一次通过Web部署它(换句话说,使用Tomcat)。
我非常感谢任何帮助,因为我正在与这个项目进行一场全天候比赛。
提前致谢。
编辑:这个被标记为状态副本的问题“我甚至尝试在同一台机器上运行它(未更改的程序)并且它可以工作,但它在diff机器上不起作用。”虽然异常是相同的,但在这种情况下,服务器和客户端都在同一台物理机器上运行,但仍然无法正常工作。此外,我还不清楚如何解决这个问题的说明。非常感谢任何帮助。编辑#2:我做在自己的项目中有远程接口,客户端项目和服务器项目都链接到该项目。他们一直都是。
因此,客户端和服务器始终具有与接口完全相同的引用。用户AminSaghi在另一个问题中表示,他通过在客户端和服务器中使用对接口的相同引用来解决问题;我的这个项目一直都有。我真的对此感到困惑。