【问题标题】:Prevent RMI Export Exception防止 RMI 导出异常
【发布时间】:2015-02-25 15:42:15
【问题描述】:

我有一个简单的客户端/服务器程序,它使用以下方法将服务器对象添加到 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 抛出这个异常一样,服务器对象仍然在注册表中,已经被第一个 ServerLauncher 放在那里,所以客户端仍然能够连接到服务器. 但是,我想知道是否有办法防止这种异常发生。 reg.rebind 不应该替换注册表上的内容吗?因此,端口 1099 是否已被使用并不重要?我不明白为什么会抛出这个异常

【问题讨论】:

  • 您在 LocateRegistry.createRegistry(1099) 上遇到异常;不在重新绑定。检查堆栈跟踪中的行号。

标签: java registry rmi


【解决方案1】:
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();
    } 

【讨论】:

    【解决方案2】:

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

    确实如此。

    因此,端口 1099 是否已在使用中应该没有关系?

    不合理。异常不是rebind()抛出的,而是createRegistry().抛出的

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

    1099 端口已被其他 JVM 中的 Registry 使用,因此您无法创建另一个 Registry。

    这里有不止一个问题。 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.");
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2010-10-11
      • 2013-04-04
      • 1970-01-01
      • 2022-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      相关资源
      最近更新 更多