着信クライアントが接続を確立しようとするたびに、executor プールを使用してソケット サーバーを開く新しいスレッドを開始する Java Swing アプリケーションがあります。
アプリケーションには 2 つのボタンが必要です。1 つはサーバーを開始するため、もう 1 つはサーバーを停止するためです。私が望むのは、サーバーのステータスを表示し、ステータスが変わるまで反対のボタンを無効にすることです。
これは私が今持っているものですが、スレッドが停止したときに EDT と通信する方法がわかりません。私にできることは、isRunning()
方法を確認することだけです。
SwingWorker を使用した方が良いでしょうか?
public class ServerManager implements Runnable {
private Executor mExecutor = Executors.newSingleThreadExecutor();
private ServerSocket mServerSocket = null;
private int mDefaultPort = 43012;
private volatile boolean isRunning = false;
public ServerManager (int port){
mDefaultPort = port;
}
@Override
public void run() {
try {
mServerSocket = new ServerSocket(mDefaultPort);
isRunning = true;
while (isRunning){
mExecutor.execute(new IncomingClientThread(mServerSocket.accept()));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(mServerSocket != null){
stop();
System.out.println("Server closed");
}
}
}
public void stop(){
try {
mServerSocket.close();
isRunning = false;
} catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}
}
public synchronized boolean isRunning() {
return isRunning;
}
public int getServerPort (){
return mDefaultPort;
}
}
そして、これが GUI スレッドにあるものです。ボタンを 1 つだけ使用し、ボタンを押すたびにテキストを変更していますが、何らかの理由でサーバーが切断された場合、ボタンは同じままです。
connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(mServer.isStopped()){
new Thread (mServer).start();
connectButton.setText("Desconectar");
infoLabel.setText("Servidor online en IP: " + NetworkUtils.getLocalIpAddress()
+ " puerto: " + mServer.getServerPort());
System.out.println(mServer.getIpAddress());
}else{
mServer.stop();
connectButton.setText("Conectar");
infoLabel.setText("Offline");
}
}
});
どんな助けでも大歓迎です!ありがとう。