我正在开发一个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);
}
}
}
有什么建议吗?
答案 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描述了我的解决方案。问题是一个基本的网络问题,但它可能发生在其他人身上。