2016-11-13 8 views
2

ため正しく閉まらソケットは、私は複数のクライアントが接続できるマルチスレッドサーバーを作成しようとしていると提供することができます。しかし、必要が生じた場合、リソースを適切に解放する方法についてはわかりません。Javaの:マルチスレッドサーバ

私のサーバーは入力スレッド(ユーザー入力を待っている)と進行中のスレッド(接続とユーザーを処理します)を実行します。サーバークラスでServerSocketを開き、処理スレッドに渡します。 ServerSocketを閉じるために、私は終了したい場合は、私はちょうど私のサーバークラスでこのメソッドを実行し

public class ClientConnector implements Runnable { 

private ServerSocket serverSocket; 

public ClientConnector(ServerSocket serverSocket) { 
    this.serverSocket = serverSocket; 
} 

@Override 
public void run() { 
    ExecutorService tcpExecutor = Executors.newCachedThreadPool(); 

    while (!serverSocket.isClosed()) { 
     Socket clientSocket = null; 

     try { 
      clientSocket = serverSocket.accept(); 
     } catch (IOException e) { 
      System.err.println("could not accept connection"); 
     } 

     if (clientSocket != null) { 
      tcpExecutor.execute(new ClientHandler(clientSocket); 
     }   
    } 
} 
} 

:それはこのようになります

public void exit() { 
    try { 
     serverSocket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

次serverSocket.acceptを起こす必要があります()の呼び出し例外をスローし、ソケットが閉じているのでループが停止します。

私の質問は - それを使用して作成されたClientSocketを暗黙的に閉じるServerSocketですか?または、開いているすべてのClientSocketを手作業で閉じる必要がありますか?もしそうなら、簡単な方法で、サーバーへの各接続をどこかに保存するのではなく、簡単な方法がありますか?

+0

問題は、彼らは、クライアントからの入力を待ってブロックされているので、我々はサーバソケットを閉じる時にオープンすることが起こる任意のソケットが開いていることです。そして、それらのものは奇妙な種類のブロックであり、中断さえできません。すでに確立されているサードパーティとの接続を待っているため、ソケットのブロックを解除するための空のパケットを送信するというトリックでさえ、これらの接続で空のパケットを挿入する方法はありません。だから、あなたはこれに対する解決策を見つけましたか? –

答えて

0

閉じるServerSocketを使用して作成されたClientSocketを暗黙的に閉じますか?

いいえ、それに影響はありません。

開いているClientSocketをすべて手動で閉じる必要がありますか?

はい、とにかく、すべてのハンドラスレッドで実行する必要があります。

もしそうなら、サーバーへの接続を1か所ごとに保存するのではなく、簡単な方法がありますか?

読み取りタイムアウトを課し、タイムアウトした各ソケットを閉じるだけです。これは、どのサーバーの通常の部分です。シャットダウンのためにソケットを収集するか、特別な対策を講じる必要はありません。

0

いいえ、それはしていません。新しい接続ができないことを意味するServerSocketが閉じられるだけです。既存のオープンソケットは引き続き動作します。

開かれたソケットを閉じるのは簡単ではありません。なぜなら、始めるのは本当に難しいことではないからです(あるいは、ネットワークプログラミングの難しい部分であると、非常に奇妙なことが起こります)。

0

は、クライアントハンドラスレッドは、処理の終了にクライアントソケットを閉じましょう。

関連する問題