关闭Java RMI服务器

时间:2016-09-16 03:35:49

标签: java multithreading rmi

  1. 当我启动GUI时,它会启动一个新线程。

    final Server myServer = new Server();
    final Thread t1 = new Thread(myServer, "T1");
    t1.start();
    
  2. GUI只有一个按钮,可以在点击时停止线程:

    final JButton btnStartServer = new JButton("Stop server");
    btnStartServer.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            myServer.stop();
        }
    });
    
  3. 该线程将创建一个对象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;
        }
    }
    
  4. 现在,如果在将任何客户端连接到服务器之前单击按钮,则代码可以正常工作。客户无法连接到服务器。但是,如果我让客户端连接到服务器,然后单击按钮,客户端仍然可以调用服务器上的方法,即使服务器已经停止(注册表未绑定和导出)。

  5. 提前致谢!

1 个答案:

答案 0 :(得分:0)

这些都没有意义。您的代码无法正确执行。您不需要循环或exit变量,也不需要Runnable或线程。远程对象构造,导出和绑定后,客户端可以进行远程方法调用。要停止它,只需取消绑定并使用UnicastRemoteObject.unexportObject()取消导出它。 NB目前,您只是在取消注册表。没有必要这样做。