当我启动GUI时,它启动一个新线程。关闭Java RMI服务器
final Server myServer = new Server(); final Thread t1 = new Thread(myServer, "T1"); t1.start();
的GUI只有一个按钮,将在单击停止线程:
final JButton btnStartServer = new JButton("Stop server"); btnStartServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { myServer.stop(); } });
线程将创建一个对象TrackingServiceImpl它是Java RMI服务器。线程本身看起来是这样的:
class Server implements Runnable { private volatile boolean exit = false; public void run() { try { TrackingService server1 = new TrackingServiceImpl(); TrackingService serverInstance, stub = null; Registry registry = null; while (!exit) { serverInstance = ((TrackingServiceImpl) server1).getInstance(); stub = (TrackingService) UnicastRemoteObject.exportObject((TrackingService) serverInstance, 0); registry = LocateRegistry.createRegistry(4444); registry.bind("TrackingService", stub); System.out.println("Tracking service has started at port " + 4444); } System.out.println("Server is stopping...."); registry.unbind("TrackingService"); UnicastRemoteObject.unexportObject(registry, false); } catch (Exception e) { } } public void stop() { exit = true; } }
现在,如果我的任何客户端连接到服务器之前,点击按钮,代码工作。客户端将无法连接到服务器。但是,如果我让客户端连接到服务器,然后单击按钮,即使服务器应该已经停止(注册表未绑定和导出),客户端仍然可以调用服务器上的方法。
在此先感谢!
_“即使服务器应该已经停止(注册表未绑定并导出)。”_这是一个假设还是一个事实? –
这难道不能阻止它吗? registry.unbind(“TrackingService”); UnicastRemoteObject.unexportObject(registry,false); 我的意思是,如果我在连接任何客户端之前停止服务器,它不会让客户端连接。但是,如果我在连接客户端后停止它,它似乎不会阻止它,客户端仍然能够调用方法。 – Teddy
@泰迪不,解除绑定并停止注册表。什么都没有停止远程对象。已持有存根的客户端可以继续调用它。看到我的答案。 – EJP