我有一个简单的客户端/服务器程序,使用以下命令将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已经在使用它并不重要吗?我不明白为什么会抛出这个异常
答案 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.");