GUI를 시작하면 새로운 스레드가 시작됩니다.Java RMI 서버 셧다운
final JButton btnStartServer = new JButton("Stop server"); btnStartServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { myServer.stop(); } });
스레드 자바 RMI 서버 인 객체 TrackingServiceImpl를 생성합니다 :
final Server myServer = new Server(); final Thread t1 = new Thread(myServer, "T1"); t1.start();
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; } }
지금, 코드가 작동합니다. 클라이언트는 서버에 연결할 수 없습니다. 그러나 클라이언트가 서버에 연결하도록 한 다음 단추를 클릭하면 클라이언트가 서버가 이미 중지되어 있어도 (레지스트리 바인딩 해제 및 내보내기) 서버에서 메소드를 계속 호출 할 수 있습니다.
미리 감사드립니다.
_ "서버가 이미 중지되어 있어도 (레지스트리 바인딩 해제 및 내보내기)."_ 이것이 가정입니까 사실입니까? –
멈추지 않습니까? registry.unbind ("TrackingService"); UnicastRemoteObject.unexportObject (registry, false); 모든 클라이언트를 연결하기 전에 서버를 중지하면 클라이언트에 연결하지 않는 것이 좋습니다. 그러나 클라이언트를 연결 한 후에 중지하면 클라이언트를 중지 한 것처럼 보이지 않으므로 클라이언트는 여전히 메소드를 호출 할 수 있습니다. – Teddy
@Teddy 아니, 그것은 바인딩을 해제하고 레지스트리를 중지합니다. 아무것도 리모트 오브젝트를 정지하고 있지 않습니다. 스텁을 이미 보유한 클라이언트는 계속 스텁을 호출 할 수 있습니다. 내 대답을 보라. – EJP