2012-03-06 23 views
1

を停止していません:真サーバーは、私は(スタート/ストップ)サーバーの実行を制御するためのブール変数を持っている

プライベートブールecoute =;ここ

は私のクラスである:私は無限ループから抜け出す私のスレッドのためにfalseに変数を渡すために、ボタンをクリックしたときに

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(); 
    } 

、何も起こりません:

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


    ecoute=false; 

} 

私はecoute=false;を置き換えsw.calcel(true);でも新しい...

どのような提案ですか?

+1

接続が確立されるまで、 'socClient = server.accept();ブロックを呼び出しませんか?その場合、ブール値は最終的にブロックされない限り、決してチェックされません。 –

答えて

4

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

  1. 接続はServerSocketのが閉じられるのServerSocket
  2. に構成されています。

server.accept()の呼び出しがブロックを停止するように、これらの2つのうちの1つを実行する必要があります。あなたに心配してください.ServerSocketを閉じると、IOExceptionがスローされます。 doInBackground()関数全体をラップするのではなく、tryブロック内のserver.accept()に呼び出しをラップするほうがよいでしょう。

+0

ありがとう、私はserver.accept()に注意を払っていない... –

+0

まさに正しい。 –

関連する問題