2016-09-16 3 views
0
  1. GUI를 시작하면 새로운 스레드가 시작됩니다.Java RMI 서버 셧다운

    final JButton btnStartServer = new JButton("Stop server"); 
    btnStartServer.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent arg0) { 
         myServer.stop(); 
        } 
    }); 
    
  2. 스레드 자바 RMI 서버 인 객체 TrackingServiceImpl를 생성합니다 :

    final Server myServer = new Server(); 
    final Thread t1 = new Thread(myServer, "T1"); 
    t1.start(); 
    
  3. GUI는 단지 클릭시 스레드를 중지하는 버튼이 있습니다. 자체는 다음과 같습니다 댓글 : I 서버에 모든 클라이언트를 연결하기 전에 버튼을 클릭하면

    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

아무 의미가 없습니다. 코드가 올바르게 실행되지 않습니다. 루프 또는 exit 변수 또는 Runnable 또는 스레드가 필요하지 않습니다. 리모트 오브젝트가 구축, export, 및 바인드되면 (자), 리모트 메소드 호출로 클라이언트가 사용할 수 있습니다. 그것을 막으려면, 단지 그것을 언 바인드하고 UnicastRemoteObject.unexportObject()으로 반출하십시오. 주의 현재 레지스트리를 안 export하고 있습니다. 그렇게 할 필요가 없습니다.

+0

GUI를 사용하여 Java RMI 서버를 시작하고 현재 실행중인 RMI 서버를 중지 할 수 있기를 바 랐기 때문에 스레드를 만들었습니다. RMI 서버를 중지하면 GUI가 닫히지 않습니다. 그것은 실행, 스레드에서 내 마지막 지점을 읽어주십시오. – Teddy

+0

레지스트리를 시작하거나 원격 객체를 내보내는 스레드는 작업을 차단하지 않으므로 루프가 필요하지 않습니다. 코드는 영원히 던져서'ExportExceptions' 루프를 무시합니다. – EJP

+0

스텁을 알 수 없지만 스텁이 내보내기되지 않았다고 말합니다. 어떤 아이디어? 스텁 = (TrackingService) UnicastRemoteObject.unexportObject ((TrackingService) serverInstance, 0); – Teddy