Java RMI Connect异常:连接拒绝主机/超时

时间:2011-12-13 06:29:22

标签: java exception java-ee rmi

我正在开发一个RMI命令行游戏但是,每当我尝试使用我的服务时,都会收到这样的错误:

java.rmi.ConnectException: Connection refused to host: 192.168.56.1; nested exception is: 
    java.net.ConnectException: Connection timed out: connect

这是我Server的主要课程:

public class RMIWar {

    public static void main(String[] args) throws RemoteException, MalformedURLException  {
        try {
            Controle obj = new Controle(4);
            Registry reg = LocateRegistry.createRegistry(1099);
            System.out.println("Server is ready");
            reg.rebind("CtrlServ", obj);
        }
        catch (Exception e) {
            System.out.println("Error: " + e.toString());
        }
    }
}

我的Client课程的主要内容:

public class RMIWarClient {
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException  {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost");
            ControleInt ctrl = (ControleInt) registry.lookup("CtrlServ");
            System.out.println("CtrlServ found...\n");
            BioRMI bio = new BioRMI(null, 5,5,5);
            ctrl.thRegister("Test", bio.atk, bio.def, bio.agi);

        }

        catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
}

有什么建议吗?

4 个答案:

答案 0 :(得分:11)

测试您的1099端口是否可用(这意味着被防火墙阻止)。此外,您没有提到您正在使用的操作系统,以及您是否在执行服务器之前启动了注册表。

此RMI tutorial解释:

  

在启动计算引擎之前,您需要启动RMI   注册表中。 RMI注册表是一个简单的服务器端引导程序命名   使远程客户端获得对引用的引用的工具   初始远程对象。

默认情况下,注册表在端口1099上运行,与您的一样。 在教程报告中,只需打开命令提示符(在Windows上)或shell终端(在类UNIX操作系统上)并键入:

对于Windows (如果启动不可用则使用javaw):

start rmiregistry

Solaris OS或Linux

rmiregistry &

<强>更新

我注意到,遵循Oracle的教程和我之前的项目,在Server类中,您没有将对象导出到RMI运行时。 然后你应该编辑这些行:

Controle obj = new Controle(4);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", obj);

为:

Controle obj = new Controle(4);
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", stub);

因为教程报告:

  

静态UnicastRemoteObject.exportObject方法导出   提供了远程对象,以便它可以接收它的调用   来自远程客户端的远程方法。

此外,如果您使用相同的主机进行RMI调用,则Client类中不需要它:

Registry registry = LocateRegistry.getRegistry("localhost");

只需调用:

Registry registry = LocateRegistry.getRegistry();

因为Oracle报告:

  

LocateRegistry.getRegistry的无参数重载合成了一个   引用本地主机和默认注册表上的注册表   port,1099。如果是,则必须使用具有int参数的重载   注册表是在1099以外的端口上创建的。

答案 1 :(得分:0)

请注意端口,因为它们可能被阻止用于防火墙,例如,如果您正在工作的安全区域工作或大学,管理员可以实施一些保护......

答案 2 :(得分:0)

我看不出你怎么可能从该代码中获取该异常。根据代码,您的服务器和客户端在同一主机上运行,​​并且您不会在同一主机中获得连接超时。

因此,假设这不是您的真实代码,并且您正在查找正确的注册表(getRegistry()的主机参数),我会询问192.168.56.1是否是您希望在给定网络拓扑时看到的IP地址。这是一个内部LAN地址,如果您的客户端在局域网外,它应该尝试连接到更公共的IP地址。如果地址不符合您的预期,我会将您推荐给item A.1 on the RMI FAQ

答案 3 :(得分:0)

我在这里java.rmi.ConnectException: Connection refused to host: 127.0.1.1;Cannot connect to Tomcat's MBeanServer via jconsole in Java6描述了我的解决方案。问题是一个基本的网络问题,但它可能发生在其他人身上。