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()その共有を再度有効にします。
問題は、共有を無効にすると、terminatewhile cicleを無期限にループして、の値をテストする必要があることですlistening。に設定listeningするとtrue、サーバーソケットを開くため、その2番目のwhileループに入り、リッスンを再開する必要があります(これとは関係ありませんが、次の場合に閉じるため、再度初期化する必要があると言っています。共有を無効にします)。ただし、無効にした後は、が呼び出されたlistening場合でも、ループをレンタルすることはありません。openConnection()
誰もがここで何が悪いのか知っていますか?