1

サーバーの実行 (開始/停止) を制御するブール変数があります。

プライベート ブーリアン ecoute=true;

ここに私のクラスがあります:

 sw=new SwingWorker<String,Void> (){

 protected String doInBackground() throws Exception {
    try {

            server = new ServerSocket(Integer.parseInt(port.getText()));

            String str1="waiting for connexion..";
            String str2="Connexion ok";

            log.append(str1+"\n");
            PrintWriter out=null;
            BufferedReader in=null;
            Socket socClient=null;
         while(ecoute){

                socClient = server.accept();  
                    log.append(str2+"\n");
                     in = new BufferedReader(
                                    new InputStreamReader(socClient.getInputStream())
                                   );
                   out = new PrintWriter(
                     new BufferedWriter(
                        new OutputStreamWriter(socClient.getOutputStream())), 
                     true);
                    String str = in.readLine();
                    log.append(str+"\n");

         }

            in.close();
            out.close();
            socClient.close();
            return "***End Reception***";
    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        return "***Error Reception***";
    }

       }

       protected void done(){
       String m="";
            try {
                m=get();
            } catch (InterruptedException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ExecutionException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        log.append(m+"\n");

       }
    };
   sw.execute();
  }

ボタンをクリックして、スレッドが無限ループから抜け出すために変数を false に渡すと、何も起こりません:

 private void arretReceptionActionPerformed(java.awt.event.ActionEvent evt) {


    ecoute=false;

}

私も新しいものに置き換えましecoute=false;sw.calcel(true);...

なにか提案を ?

4

1 に答える 1

4

ServerSocket が原因で、ループが終了しません。「ecoute」が false であっても、次の 2 つの条件のいずれかが満たされるまで、server.accept() はブロックされます。

  1. ServerSocket への接続が確立されます
  2. ServerSocket が閉じられています。

server.accept() への呼び出しがブロックを停止するように、これら 2 つのいずれかを行う必要があります。注意してください - ServerSocket を閉じることを選択すると、IOException がスローされます。doInBackground() 関数全体をラップするのではなく、server.accept() への呼び出しを try ブロックでラップした方がよいでしょう。

于 2012-03-06T17:35:27.710 に答える