ServerSocket
着信クエリをリッスンするサーバー アプリケーションがあります。クエリを送信するクライアントは、サーバーへのソケットを開き、クエリを上流に渡し、(おそらく短時間の後に) クエリの送信に使用したのと同じソケットからクエリへの応答を読み取ることを期待しています。
このために、私はを使用しようとしていますExecutorCompletionService
。さまざまなクエリ クラスがさまざまな に渡されますCallable
が、すべてが結果として a を返すことが期待されString
ます。
実際にクライアントに返信しようとする段階に達するまで、これらすべては非常に扱いやすいものです。現在、Future
オブジェクトはすべて typeFuture<String>
ですが、その結果 ( String
) を適切なに結合できませんSocket
。
私の解決策は、すべてのCallable
s を次のような型Callable<StringSocketPair>
にすることです。StringSocketPair
public class StringSocketPair {
Socket sock;
String content;
}
しかし、これはすべて少し奇妙に思えます。コンストラクターに を渡してSocket
、メソッドからの結果Callable
と一緒にそれを返すことができるようにする必要があるからです。をポーリングするさらに別のスレッドにプッシュできるようにするためです。String
call()
String
Socket
ExecutorCompletionService.take()
もう 1 つのオプションは、Runnable
s の代わりにCallable
s を使用し、各Runnable
タスクを独自に応答させることですが、12 種類ほどのクエリ タイプがあるため、それぞれに独自のタスク オブジェクトがあり、いくつかの呼び出しSocket
を追加する必要はありません。すべてのタスク オブジェクトrespondToClient()
のすべてのメソッドの末尾に種類を設定します。run()
かなり一般的なセットアップであると私が考えるものには、より簡単な解決策が必要ですか?