我对RMI有一个奇怪的问题。首先,我启动了服务器,然后我启动了客户端。在第一次,我可以从客户端连接到服务器。然后我停止客户端。我试图重新连接客户端。我可以得到服务器存根,但是当我从存根调用一个方法时,我得到了一堆“拒绝连接”的例外。我没有打开防火墙。
我设置服务器的代码
public Server(String name, int port) {
try {
LocateRegistry.createRegistry(port);
ServerModel server = new ServerModel();
String serverStr = "rmi://localhost:" + port + "/" + name;
Naming.rebind(serverStr, server);
} catch (MalformedURLException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
} catch (RemoteException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
以及设置客户端的代码
public Client(String serverName, int port) throws RemoteException {
controller = new ClientController();
view = new MainView();
ClientRegistry.setData(ClientConstant.FRONT_CONTROLLER, controller);
try {
String serverStr = "rmi://localhost:" + port + "/" + serverName;
ServerInterface serverStub = (ServerInterface) Naming.lookup(serverStr);
ClientRegistry.setData(ClientConstant.STUB, serverStub);
view.setFrontController(controller);
view.display();
} catch (Exception ex) {
// Show error if server is not available
JOptionPane.showMessageDialog(null, "Server is not available", "Error", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
和例外
java.rmi.ServerException:服务器线程中发生了RemoteException;嵌套异常是: java.rmi.ConnectException:连接拒绝主机:192.168.0.104
答案 0 :(得分:1)
当您调用LocateRegistry.createRegistry
时,您将在特定端口上实例化新的RMI注册表。另一方面,Naming.rebind
尝试在"默认"上注册您的对象。注册表,在默认端口上。因此它失败了,因为默认端口上没有注册表。
请改为尝试:
Registry registry = LocateRegistry.createRegistry(port);
registry.rebind(serverStr, server);
答案 1 :(得分:0)
您的服务器正在退出。将createRegistry的结果存储到静态变量中。