【发布时间】: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) 上遇到异常;不在重新绑定。检查堆栈跟踪中的行号。