1

これは、ソケット経由のサーバークライアントのネットワーク化を伴います。クライアントスレッドはwhile(boolean)ループで実行されています。これはClientBeanクラスからアクセスされ、条件はfalseに設定されます。スレッドを停止するか、終了する必要があります。しかし、私はスレッドの実行のループの条件をfalseに設定した後、スレッドのInputStreamをもう一度読み取ろうとしています。 SocketExceptionがスローされます。スレッドは終了後にもう一度実行されます

Beanのコードの一部: -

public void disconnect() { 
     client.setSendMessage(key + "disconnect"); 
     thd.setRunning(false); 
     client.setRunning(false); 
     try { 
      client.getSock().close(); 
      inputDisabled = sendBtnDisabled = true; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

とスレッドのrun()メソッド: -

public void run() { 
     while (running) { 

      try { 
       if (!sock.isClosed()) 
        if ((receiveMessage = receiveRead.readLine()) != null) { 
         msg = receiveMessage; 
        } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

私はラインif ((receiveMessage = receiveRead.readLine()) != null)上の例外を取得します。 スレッドが停止した後、run()のループがもう一度実行されるのはなぜですか?さらに、私はbeanからソケットを閉じたときに、どのようにして条件if (!sock.isClosed())を満たしていますか?

+1

'running'はvolatileですか?たぶん、スレッドはまだそれを「真」と見なします。 – Marvin

+0

スレッドとソケットに関するより多くのコードを提供する必要があります。完全なスタックトレース。 –

+0

いいえ、それは揮発性ではありません。 –

答えて

0

スレッドが停止してからrun()のループがもう一度実行されるのはなぜですか?

あなたのループ状態

while (running) { 

ので、running = falseノート、あなたが

 } catch (IOException e) { 
      e.printStackTrace(); // print error and pretend it didn't happen. 
     } 

を行う際に簡単な解決策は、そのようにする場合、ループの外のtry/catchを置くことになるまでループしますエラーが発生してループが切断されるか、接続を閉じてもう一度試してください。

Beanからソケットを閉じたときに、if(!sock.isClosed())の条件を満たす方法は?

このメソッドは、ソケットでclose()を呼び出すと、isClosed == trueを返します。

+0

しかし、私のコードは、ソケットが閉じられているストリームからの読み込みを試みないスムーズなプロセスが必要です。スレッドを止めてからソケットを閉じてください。 –

+0

@SohamBanerjeeほとんどの場合、あなたのスレッドはreadLine()でブロックするので、ソケットをチェックするには遅すぎます。私がしているのは、ソケットを閉じる直前に 'boolean closed'フィールドを' true'に設定しています。私がIOExceptionを取得した場合、ソケットを閉じようとした後に例外が発生した場合、私はその例外を無視します。 –

関連する問題