web-dev-qa-db-ja.com

Java HTTPプロキシサーバー

複数のクライアントからの要求をリモートサーバーにプロキシするHTTPプロキシサーバーアプリケーションを実装する必要があります。

手順は次のとおりです。

  1. クライアントがリクエストをプロキシに転送する
  2. サーバーへのリクエストのプロキシ転送
  3. サーバーはプロキシにリクエストを返します
  4. プロキシはクライアントにリクエストを返します。

このプロキシを実装する方法がわからないだけです。私の最初の考えは、リモートサーバーに要求を転送してクライアントに応答を返すためにjersey/Apache httpclientを使用するTomcatアプリケーションを実装することでした。

そのようなプロキシサーバーを実装するより良い方法はありますか?

プロキシは複数のスレッドを処理する必要があります。

17
Alistair walsh

これをサーブレットとして実装することはできません。また、任意の形式のHTTPクライアントを使用する理由はありません。

機能のないプロキシサーバーは本当に簡単なものです。

  1. 接続を受け入れ、そのスレッドを開始します。
  2. 空白行までクライアントからの要求を読み取ります。
  3. GETコマンドまたはCONNECTコマンドなどを抽出し、指定されたホストに接続します。
  4. それが失敗した場合、適切なHTTPエラー応答を送り返し、ソケットを閉じて、それを忘れてください。
  5. それ以外の場合は、各方向に1つずつ、2つのスレッドを開始してバイトをコピーします。派手なものではなく、ただ

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    
  6. それらのソケットの1つがEOSを読み取るとき、出力のために他のソケットをシャットダウンし、EOSを取得したスレッドを終了します。
  7. EOSのソースであったソケットがすでに出力用にシャットダウンされている場合は、両方を閉じます。

または、Apache SQUIDを使用します。

11
user207421

チェックアウト LittleProxy -着信および発信要求用の組み込みクラスがあります。サーブレットでHTTPリクエストを処理するのと同じようにコードを書くだけです。

8
Ilya Yevlampiev