사용자가 GUI를 사용하여 서버를 켜거나 끌 수있는 클라이언트 - 서버 응용 프로그램을 만들고 있습니다. 그것을 작동 시키려면 SwingWorker 중첩 클래스를 사용합니다. 모두 제대로 작동하는 것처럼 보입니다. 그러나 서버를 껐다가 다시 켜면 작동하지 않습니다. 아마도 다른 인스턴스를 덮어 쓸 수 없기 때문에 가능할 것입니다. 서버가 수락되면 차단됩니다) 방법. 사용자가 스위치 끄기 버튼을 눌렀을 때 이전 인스턴스를 중지하려고하지만 어떻게 작동하는지 알 수 없습니다. 여기 다른 클래스의 클래스 인스턴스를 어떻게 죽입니까?
나에게 문제를 제공하는 SwingWorker의 클래스의 :class SwingWorkGUI extends SwingWorker
{
@Override
protected Integer doInBackground() throws Exception {
int delay = 1000;
final Timer time = new Timer(delay, null);
time.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (Server.up == true){
upTimeMillis += 1000;
long diff = upTimeMillis/1000;
long numHrs = diff/60;
diff = diff%60;
long numMins = diff/60;
long numSecs = diff%60;
upTime.setText(numHrs + ":" + numMins + ":" + numSecs);
}
else {
upTime.setText("Server Actually Down");
time.stop();
}
}
});
time.start();
mainServer = new Server();
return null;
}
}
매번 버튼 켜기를 누를 때의의 actionPerformed하지
SwingWorkGUI swg = new SwingWorkGUI();
swg.execute();
를 실행하는 경우 서버가 다음에 대한 여부를 이미 여부를 결정
실행 블록은 다음 명령어에서 호출되지만 두 번째 (세 번째 계산 시간) 호출됩니다.
mainServer = new Server();
Server.up은 서버에서 while (true) 메소드를 종료하는 데 도움이되는 정적 변수입니다.
모든 응용 프로그램을 닫지 않고 열린 인스턴스를 삭제하려면 어떻게해야합니까?
별도의 스레드에서 서버를 실행하는 경우. 이렇게하면 서버가 무엇을 하던지 종료하게됩니다. (당신은 또한'InterruptedException'을'Server'에서 잡아서 필요에 따라 내부 정리를하고 싶을 것입니다.) – SamYonnou
외부 스레드에서'socket.close()'를 호출하여'socket.accept()'메소드를 중단하고 서버를 종료하십시오 : http://stackoverflow.com/questions/2983835/how-can-i-interrupt- a-serversocket-accept-method – DannyMo