2016-09-16 14 views
0
  1. GUIを起動すると、新しいスレッドが開始されます。Java RMIサーバのシャットダウン

    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. スレッドは、Java RMIサーバであるオブジェクトTrackingServiceImplを作成します。自身が次のようになりますスレッド:私は、サーバーへのすべてのクライアントを接続する前に、ボタンをクリックした場合

    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. は今、コードが動作します。クライアントはサーバーに接続できません。しかし、クライアントをサーバーに接続させてからボタンをクリックすると、サーバーはすでに停止していても(レジストリのバインド解除およびエクスポート)、クライアントは引き続きサーバー上のメソッドを呼び出すことができます。

ありがとうございます!

+0

_ "サーバが既に停止していても(レジストリがアンバインドされ、エクスポートされています)" _これは前提か事実ですか? –

+0

これはそれを停止しませんか? registry.unbind( "TrackingService"); UnicastRemoteObject.unexportObject(registry、false); クライアントに接続する前にサーバーを停止しても、クライアントに接続させないということは意味があります。しかし、クライアントを接続した後にクライアントを停止しても、クライアントを停止しないと、クライアントは引き続きメソッドを呼び出すことができます。 – Teddy

+0

@Teddyいいえ、それはそれをバインド解除し、レジストリを停止します。何もリモートオブジェクトを停止していません。既にスタブを保持しているクライアントは、引き続きそのスタブを呼び出すことができます。私の答えを見てください。 – EJP

答えて

0

これは意味がありません。コードが正しく実行されません。ループ、または変数、またはRunnableのどちらか、またはスレッドは必要ありません。リモートオブジェクトが構築され、エクスポートされ、バインドされると、クライアントはリモートメソッド呼び出しのためにそのオブジェクトを使用できます。それを止めるには、アンバインドしてUnicastRemoteObject.unexportObject()でアンエクスポートしてください。注意:現在のところ、あなたはレジストリをアンエクスポートするだけです。それを行う必要は本当にありません。

+0

GUIをJava RMIサーバーを起動して現在実行中のサーバーを停止できるようにしたいので、スレッドを作った。 RMIサーバーを停止してもGUIは終了しません。それは実行され、スレッドの私の最後のポイントをお読みください。 – Teddy

+0

レジストリを起動したり、リモートオブジェクトをエクスポートするためにスレッドを必要としません。これらのスレッドは操作をブロックしているわけではなく、ループも必要ありません。あなたのコードは永遠に 'ExportExceptions'を無視してループします。 – EJP

+0

スタブをアンエクスポートしようとしましたが、スタブがエクスポートされていないと表示されます。何か案は? スタブ=(TrackingService)UnicastRemoteObject.unexportObject((TrackingService)serverInstance、0); – Teddy