2つのwhile条件があり、一方は他方の内側にあり、ブール値を使用してそれらを制御します。基本的に、1つは共有を終了するためのもので、もう1つは接続をリッスンするためのものです。ユーザーは共有を無効にすることを選択できます。この場合、サーバーはリッスンを停止しますが、終了しません。ユーザーが終了を選択した場合、両方のブール値がfalseに設定され、サイクルが終了します。
これは私のコードです:
public void run() {
while (!terminate) {
while (listening) {
try {
// accept connection -> create a new thread for each client
ClientServerShareInstance clientServerShareInstance = new ClientServerShareInstance(serverSocket.accept(), ui);
Thread clientServerThread = new Thread(clientServerShareInstance);
clientSockets.add(clientServerShareInstance);
connectedClients++;
clientServerThread.start();
} catch (IOException ex) {
}
}
}
}
public void closeAllClientConnections() {
for (Iterator it = clientSockets.iterator(); it.hasNext();) {
ClientServerShareInstance clientServerShareInstance = (ClientServerShareInstance) it.next();
clientServerShareInstance.closeAllConnections();
it.remove();
}
try {
this.serverSocket.close();
} catch (IOException ex) {}
this.setActive(false);
this.connectedClients = 0;
}
public void openConnection() {
try {
serverSocket = new ServerSocket(portNumber, 0, Inet4Address.getLocalHost());
setActive(true);
} catch (IOException ex) {}
}
}
このcloseAllClientConnections()
メソッドは共有を無効にし(終了しません)、openConnection()
その共有を再度有効にします。
問題は、共有を無効にすると、terminate
while cicleを無期限にループして、の値をテストする必要があることですlistening
。に設定listening
するとtrue
、サーバーソケットを開くため、その2番目のwhileループに入り、リッスンを再開する必要があります(これとは関係ありませんが、次の場合に閉じるため、再度初期化する必要があると言っています。共有を無効にします)。ただし、無効にした後は、が呼び出されたlistening
場合でも、ループをレンタルすることはありません。openConnection()
誰もがここで何が悪いのか知っていますか?