2017-07-31 10 views
0

私は、無限ループで接続を受け入れるServerSocketを持っています。しかし、私は、接続の受け入れを停止し、ユーザーがプログラムを終了するように要求したときに現在開いている接続の処理を終了したいと思います。ServerSocketタイムアウトとキュー接続

シャットダウンフックを使用して、これ以上の接続を受け付けないというユーザの意図をプログラムが認識できるようにフラグを設定します。ただし、このフラグが設定されるまでには、すでにaccept()でブロックされています。私が次のようなことをした場合:

ServerSocket servsoc = new ServerSocket(port); 
servsoc.setSoTimeout(2000); 

// Infinite loop processing connections 
while (!shutdown) { 
    do { 
     try { 
      connected = true; 
      socket = servsoc.accept(); 
     } catch (SocketTimeoutException tim) { 
      connected = false; 
     } 
    } while (!shutdown && !connected) 

    if (connected) { 
     ... remainder of code ... 
    } 
} 

キューに入れられた接続がServerSocketによって削除されることはありますか?

これは別の質問です。接続はのキューに入っていますか?

+0

スレッドを中断しても、accept呼び出しからソケットが切断されることはありません。あなたができることは、シャットダウンフラグを設定してサーバソケットへの接続を開き、 "noop"メッセージを送信してacceptループから抜け出す方法です。 – user3745362

答えて

0

ループ内にループがあります。コードでは1つの接続しか処理できません。 新しいスレッドですべての受信ソケットプロセスを試して、何らかのシングルトンで多分グローバル状態(シャットダウンフック)を保持できますか?

いくつかの接続スレッドから、グローバル変数を設定し、新しいソケットを受け入れることを停止できます。

0

ServerSocketは、キューに入れられた接続を削除できますか?

このコードはありません。タイムアウトが発生した場合、失われたキュー接続はありません。

これは別の質問です。接続はキューに入れられていますか?

はい、サイズ、コンストラクタのパラメータによってbacklogぼんやり制御することができる「バックログキュー」と呼ばれるものがあります。