web-dev-qa-db-ja.com

出力ストリームからの応答の処理

サーバーへのInputStreamとOutputStreamがあります。大量のJSONリクエストをネットワーク経由で送信し、このサーバーから一連の応答を返すことができます。これから、リクエストを作成して送信し、レスポンスを取得するgetFoo()のようなゲッターを提供するラッパーを構築したいと思います。

一度にこの単一のInputStreamとOutputStreamを使用するクライアントが多数いる可能性があることを考えると、これをどのように処理するかはわかりません。これを設計するための良い方法があることを望んでいます。

これが私が考えた1つのオプションです:

  • InputStreamリーダーは常に応答を読み取り、各RequestTypeの最新の応答を格納する_Map<RequestType, Response>_に配置します(requestTypeはgetFoogetBarなど)。
  • ラッパーでgetFoo()を呼び出すと、リクエストがOutputStreamに書き込まれ、responseMap.get(RequestType.FOO)を待機して読み取り、マップ内のそのエントリが削除されます。

別のオプション:

  • ラッパーでgetFoo()を呼び出すと、InputStreamリーダーにコールバックとして登録されます。
  • InputStreamリーダーが応答(たとえば、上記のfoo応答)を解析すると、foo応答を待機しているすべてのリスナーに通知し、リスナーをクリアします。

並行性について考え始めると、これらは両方とも壊れやすいように見えます。これにアプローチするより良い方法はありますか?

1
Crummy

サーバーへのInputStreamとOutputStreamがあります。大量のJSONリクエストをネットワーク経由で送信し、このサーバーから一連の応答を返すことができます

サーバーへの複数の接続を開くだけでなく、複数の入出力ストリームを取得できますか?そのシナリオでは、その接続を開いているコンポーネントは、その接続を対象とした応答のみを取得し、それだけを取得すると断言できます。

2
Brian Agnew