防止RMI导出异常

时间:2015-02-25 15:42:15

标签: java registry rmi

我有一个简单的客户端/服务器程序,使用以下命令将Server对象添加到ServerLauncher类中的注册表中:

try {
        Registry reg = LocateRegistry.createRegistry(1099);
        reg.rebind("ServerObject", new Server());
        System.out.println("Server set up completed.");
    } 
    catch (RemoteException e) {
        e.printStackTrace();
    } 

然后客户端使用以下命令获取对RMI对象的引用:

Registry reg = LocateRegistry.getRegistry("localhost", 1099);
remoteServerObject = (ServerInterface) reg.lookup("Server");

程序运行正常,客户端可以成功连接到服务器。但是,每当我多次启动ServerLauncher时,我都会收到错误:

java.rmi.server.ExportException:端口已在使用中:1099;嵌套异常是:     java.net.BindException:已在使用的地址:JVM_Bind

这个异常实际上并没有影响我的程序的功能,就像第二个ServerLauncher抛出此异常一样,Server对象仍然在第一个ServerLauncher放置的注册表中,因此客户端仍然可以连接到服务器。 但是,我想知道是否有办法防止此异常发生。不应该重新注册替换注册表上的内容吗?因此,如果端口1099已经在使用它并不重要吗?我不明白为什么会抛出这个异常

2 个答案:

答案 0 :(得分:0)

try {
        Registry reg = LocateRegistry.createRegistry(1099);
        reg.rebind("ServerObject", new Server());
        System.out.println("Server set up completed.");
    } 
    catch (RemoteException e) {
        Registry reg = LocateRegistry.getRegistry(1099);
        reg.rebind("ServerObject", new Server());
        System.out.println("Server already installed.");
        e.printStackTrace();
    } 

答案 1 :(得分:0)

  

不应该reg.rebind替换注册表上的内容吗?

确实如此。

  

因此,端口1099是否已被使用并不重要?

Non sequitur。 rebind()没有抛出异常,createRegistry().

抛出了异常
  

我不明白为什么会抛出这个异常

注册表已在另一个JVM中使用端口1099,因此您无法创建另一个注册表。

这里有一个以上的问题。 Registry变量应该是静态的,否则可能是垃圾收集的。如果您想重新使用现有的注册表,只需调用LocateRegistry.getRegistry():这样的内容:

static Registry registry;

try {
    registry = LocateRegistry.createRegistry(1099);
} catch (ExportException exc) {
    registry = LocateRegistry.getRegistry(1099);
}
registry.rebind("ServerObject", new Server());
System.out.println("Server set up completed.");