Java 从servlet调用RMI方法
我正在编写一个servlet,可以调用rmi。我已经编写了RMI服务器,并用JavaSwing客户机对其进行了测试,一切正常。但是我在使用servlet时遇到了一个问题。 当用户打开主web页面时,servlet自动调用rmi方法来检索数据库中的一些信息,然后构建web页面来显示。 当用户单击触发另一个调用另一个rmi方法的servlet的某个链接时,我得到一个错误:Java 从servlet调用RMI方法,java,servlets,rmi,Java,Servlets,Rmi,我正在编写一个servlet,可以调用rmi。我已经编写了RMI服务器,并用JavaSwing客户机对其进行了测试,一切正常。但是我在使用servlet时遇到了一个问题。 当用户打开主web页面时,servlet自动调用rmi方法来检索数据库中的一些信息,然后构建web页面来显示。 当用户单击触发另一个调用另一个rmi方法的servlet的某个链接时,我得到一个错误: java.rmi.ConnectException: Connection refused to host: 192.168.1
java.rmi.ConnectException: Connection refused to host: 192.168.1.101; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at project.RemoteClass.getEngine(RemoteClass.java:33)
at project.MainServlet.processRequest(MainServlet.java:57)
at project.MainServlet.doGet(MainServlet.java:176)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
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.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
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:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
当此代码执行registry.lookup方法时,会出现此错误。
我怎样才能解决它
拒绝连接到主机:192.168.1.101
...
位于sun.rmi.registry.RegistryImpl\u Stub.lookup(未知源)
192.168.1.101上没有运行的注册表,在本例中是在端口22222上运行的,您称之为LocateRegistry.getRegistry(“192.168.1.101”,22222)。
也许你的注册表在第一次呼叫后退出。如果您使用
LocateRegistry.createRegistry()
在服务器上创建它,并且不将结果存储在静态字段中,那么它很容易被垃圾收集 192.168.1.101真的有一台服务器在监听端口22222吗?在正确的界面上?你能通过telnet看看它是否有效吗?当然,它很有效。另外,如果它不起作用,第一个rmi调用也会失败。您真的需要不断地重新分配接口\u引擎
静态字段吗?嗯,不,它不应该是静态的,但我不想每次servlet需要调用远程方法时都创建RemoteClass对象!但你还是这么做。请注意,每次方法执行RemoteClass#getEngine
时,您总是执行interface_engine=(RemoteInterface)registry.lookup(skeleton)代码>,这很奇怪(甚至奇怪,因为此方法不是线程安全的)。
public class RemoteClass {
private RemoteClass(){}
private static Registry registry = null;
private static RemoteInterface interface_engine = null;
private static final String rmiAddress = "192.168.1.101";
private static final int rmiPort = 22222;
private static final String skeleton = "ProjRMISkeleton";
public static RemoteInterface getEngine() throws RemoteException {
registry = LocateRegistry.getRegistry(rmiAddress, rmiPort);
try {
interface_engine = (RemoteInterface) registry.lookup(skeleton);
} catch (RemoteException ex) {
Logger.getLogger(MainServlet.class.getName()).log(Level.SEVERE, null, ex);
} catch (NotBoundException ex) {
Logger.getLogger(MainServlet.class.getName()).log(Level.SEVERE, null, ex);
}
return interface_engine;
}
}