2013-05-08 4 views
12

Мне нужно реализовать приложение прокси-сервера HTTP, которое будет запрашивать прокси-запросы от нескольких клиентов на удаленный сервер.Java HTTP proxy server

Вот шаги:

  1. Client вперед запрос на прокси
  2. Proxy вперед запрос к серверу
  3. возвращает сервер запрашивают Прокси
  4. прокси-сервер возвращает запрашивают Клиенту.

Я просто не знаю, как мне реализовать этот прокси. Моя первая мысль заключалась в том, чтобы реализовать приложение tomcat, которое использует jersey/apache httpclient для перенаправления запроса на удаленный сервер и возврата ответа клиенту?

Есть ли лучший способ реализовать такой прокси-сервер?

Прокси-сервер должен обрабатывать несколько потоков.

ответ

9

Вы не можете реализовать его как сервлет, и нет никакой причины использовать какую-либо форму HTTP-клиента.

безликая прокси-сервер А очень простая вещь:

  1. Принять соединение и запустить поток для него.
  2. Прочтите запрос от клиента до пустой строки.
  3. Извлечь команду GET или CONNECT или что бы то ни было, и подключиться к названному хосту.
  4. Если это не удается, отправьте соответствующий ответ об ошибке HTTP, закройте сокет и забудьте об этом.
  5. В противном случае запустите два потока для копирования байтов, по одному в каждом направлении. Ничего особенного, просто

    while ((count = in.read(buffer)) > 0) 
    { 
        out.write(buffer, 0, count); 
    } 
    
  6. Когда один из этих гнезд читает EOS, выключит другой разъем для выхода и выхода нити, которая получила EOS.
  7. Если сокет, который был источником EOS, уже выключен для вывода, закройте их оба.

Или используйте SQUID Apache.

8

Отъезд LittleProxy - он имеет встроенные классы для входящих и исходящих запросов; вы можете просто написать свой код аналогично тому, как вы будете обрабатывать HTTP-запрос в сервлете.

+0

И да, он имеет встроенную поддержку CONNECT, которая фактически не встроена в API сервлета –