TCPクライアント/サーバー通信の構造は次のとおりです。
- サーバーの起動時に、サーバーはアクセプタースレッドを開始します。アクセプタースレッドは、クライアント接続を受け入れ、ServerSocketを渡します。
- クライアント接続が到着すると、アクセプタースレッドはServerSocketでaccept()を呼び出し、クライアント処理ジョブをワーカースレッドに(エグゼキューター/スレッドプールによって)送信し、クライアントソケットを提供します。
- ループ内のワーカーは、クライアントソケットストリームからデータを読み取り、それを処理して応答を送信します。
問題は、システム全体を適切に停止する方法です。ServerSocketを閉じるだけでアクセプタースレッドを停止できます。これにより、accept()ブロッキング呼び出しがSocketExceptionをスローします。しかし、どのように労働者を止めるのですか?彼らはストリームから読み取り、この呼び出しはブロックされています。これによると、ストリームはInterruptedExceptionをスローしないため、workerをinterrupt()することはできません。
別のスレッドからワーカーソケットを閉じる必要があるようですよね?このためには、ソケットをパブリックフィールドにするか、ワーカーにソケットを閉じるためのメソッドを提供する必要があります。これはいいですか?それとも私のデザイン全体に欠陥があるのでしょうか?