Прокси-сервер Java HTTP
Мне нужно реализовать приложение HTTP-прокси-сервера, которое будет запрашивать прокси-запросы от нескольких клиентов на удаленном сервере.
Вот шаги:
- Запрос клиента на прокси-сервер
- Запрос прокси-сервера на сервер
- Сервер возвращает запрос на прокси
- Прокси возвращает запрос клиенту.
Я просто не уверен, как мне реализовать этот прокси. Моя первая мысль заключалась в том, чтобы реализовать приложение tomcat, которое использует jersey/apache httpclient для перенаправления запроса на удаленный сервер и возврата ответа клиенту?
Есть ли лучший способ реализовать такой прокси-сервер?
Прокси-серверу потребуется обработать несколько потоков.
Ответы
Ответ 1
Вы не можете реализовать его как сервлет, и нет причин использовать какую-либо форму HTTP-клиента.
Безликий прокси-сервер - это очень простая вещь:
- Примите соединение и запустите для него поток.
- Прочитайте запрос от клиента до пустой строки.
- Извлеките команду GET или CONNECT или что-то еще, и подключитесь к указанному узлу.
- Если это не удается, отправьте ответ на соответствующий HTTP-запрос, закройте сокет и забудьте о нем.
-
В противном случае запустите два потока для копирования байтов, по одному в каждом направлении. Ничего необычного, просто
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
- Когда один из этих сокетов читает EOS, выключите другой сокет для вывода и выйдите из потока, который получил EOS.
- Если сокет, который был источником EOS, уже выключен для вывода, закройте их оба.
Или используйте SQUID для Apache.
Ответ 2
Отъезд LittleProxy - он имеет встроенные классы для входящих и исходящих запросов; вы можете просто написать свой код аналогично тому, как вы будете обрабатывать HTTP-запрос в сервлете.
Ответ 3
WireMock может работать как прокси-сервер. Смотрите http://wiremock.org/docs/running-standalone/