Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从servlet调用RMI方法_Java_Servlets_Rmi - Fatal编程技术网

Java 从servlet调用RMI方法

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

我正在编写一个servlet,可以调用rmi。我已经编写了RMI服务器,并用JavaSwing客户机对其进行了测试,一切正常。但是我在使用servlet时遇到了一个问题。 当用户打开主web页面时,servlet自动调用rmi方法来检索数据库中的一些信息,然后构建web页面来显示。 当用户单击触发另一个调用另一个rmi方法的servlet的某个链接时,我得到一个错误:

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;
    }
}