Подтвердить что ты не робот

Асинхронный HTTP-клиент для Java

Являясь относительным новичком в мире Java, я нахожу много вещей, которые, к сожалению, немыслимы для выполнения, которые относительно тривиальны во многих других рамках. Первичным примером является простое решение для асинхронных HTTP-запросов. Видя, что, похоже, никто не существует, каков наилучший подход? Создавая свои собственные потоки, используя блокирующий тип lib, такой как httpclient или встроенный java файл http, или я должен использовать новый неблокирующий материал io java - он кажется особенно сложным для чего-то, что должно быть простым.

То, что я ищу, - это что-то простое в использовании с точки зрения разработчика - что-то похожее на URLLoader в AS3 - где вы просто создаете URLRequest - присоединяете кучу обработчиков событий для обработки завершения, ошибок, прогресса и т.д., и вызовите метод, чтобы его отключить.

Если вы не знакомы с URLLoader в AS3, это так просто и выглядит примерно так:

private void getURL(String url)
{
    URLLoader loader = new URLLoader();
    loader.addEventListener(Event.Complete, completeHandler);
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

    URLRequest request = new URLRequest(url);

    // fire it off - this is asynchronous so we handle
    // completion with event handlers
    loader.load(request);
}

private void completeHandler(Event event)
{
    URLLoader loader = (URLLoader)event.target;
    Object results = loader.data;

    // process results
}

private void httpStatusHandler(Event event)
{
    // check status code
}

private void ioErrorHandler(Event event)
{
    // handle errors
}
4b9b3361

Ответ 2

Версия 4.0 Apache Commons HttpClient (теперь в HttpComponents/HttpCore) также поддерживает Java NIO (неблокирующий IO). Я думаю, что это ваш лучший выбор.

Ответ 3

Если вы еще не посмотрели на него, проверьте Java 5 java.util.concurrent - он значительно упрощает разработку многопоточных приложений. Вы можете настроить ThreadPoolExecutor, который управляет, скажем, четырьмя потоками. Затем вы загружаете пул для выполнения любого количества задач. Каждая задача - Runnable. ThreadPoolExecutor ставит в очередь задачи Runnable и параллельно передает их в доступные потоки. Метод pool afterExecute() вызывается, когда каждая задача Runnable завершается.

Я живо помню, как писал пул потоков извлечения для веб-браузера, написанного на Java в 1999 году, и это было медведь, чтобы получить право. В прошлом месяце я написал нагрузочный тестер для веб-сервера. Тестер имеет ThreadPoolExecutor, у которого есть n потоков, а задачи Runnable, которые я кормлю каждый, извлекают страницу с помощью Apache HTTP Client. Потребовалось всего час или два, чтобы заставить его работать достаточно хорошо. Я думаю, вам понравится java.util.concurrent в сочетании с Apache HTTP Client, хотя кажется, что вам нужно будет сделать некоторые настройки для индикации прогресса.

(Обратите внимание, что Apache HTTP Client выполняет собственный пул потоков, а конфигурация по умолчанию ограничивает вас 20 потоками max и всего двумя на каждый веб-сервер.)

Обновление: здесь ссылка на Apache HTTP Client. Обязательно прочитайте MultiThreadedHttpConnectionManager, это то, что обрабатывает пул соединений, и это не показано в самом базовом примере.

Ответ 4

Похоже, вы хотите (часть) NIO - там хороший учебник здесь, асинхронная сетевая часть начинается с p. 30, и в конце есть много полезных ссылок.

Ответ 6

существуют библиотеки и фреймворки, написанные поверх NIO/Netty - RxNetty и Vertx, что может быть полезно для написания асинхронного HTTP-клиента

Ниже приведен пример кода с использованием vertx

public class Client extends AbstractVerticle {

  @Override
  public void start() throws Exception {
    //lambda callback would be called when the response comes back
    vertx.createHttpClient().getNow(8080, "localhost", "/", resp -> {
      System.out.println("Got response " + resp.statusCode());
      resp.bodyHandler(body -> {
        System.out.println("Got data " + body.toString("ISO-8859-1"));
      });
    });
   //this code statement will execute before response comes back
   System.out.println("I am not blocked");
  }
}

вы можете найти полный код примера с здесь

Ответ 7

Итак, вероятно стоит подумать, что ActionScript и Java не поддерживают одну и ту же нишу. Например, Java делает некоторые вещи более утомительными - но обычно это дает пользователю больше опций в том, как, например, выполняется HTTP-соединение, в то время как ActionScript может абстрагировать детали или возможные ошибки для удобства использования. Но, ваша точка все еще стоит.

Я сам не знаю асинхронного HTTP-клиента для Java. Алекс Мартелли отвечает на вопросы о Java NIO, что является хорошим ответом, если вы заинтересованы в реализации протокола HTTP в своем собственном коде. NIO позволит вам использовать сокеты для подключения к веб-серверу - но тогда вам нужно вручную создать свои собственные запросы GET и проанализировать входящие HTTP-заголовки/данные.

Другим вариантом является использование классов java.net.URL - и вы можете найти множество руководств для тех, кто находится в сети и в stackoverflow. Вы можете обернуть их в потоки, поэтому ваша Java-программа имеет несколько потоков выполнения.

Но тогда вы столкнулись с проблемой синхронизации. Я согласен, это боль, но тогда он предлагает более гранулированный уровень гибкости.

(Я понимаю, что это не отвечает на ваш вопрос - и если кто-нибудь действительно знает о возможности java для асинхронных HTTP-запросов, мне было бы интересно узнать!)

Ответ 8

AFAIK инструмент TCPMon использует аналогичный подход к тому, что вы описываете. Вы можете взглянуть на исходный код в SVN-браузере

Также посмотрите WGET-java для кишок блокирующего кода.

Но нужно ли писать на Java? Существует множество других подходов, использующих JRuby или Rhino для выполнения чего-то подобного, который будет работать на JVM, но не написан на Java.

Ответ 9

httpunit и htmlunit являются 2 настраиваемыми и настраиваемыми HTTP-клиентами Java, способными к чему-либо в браузере, таким как имитация firefox, просмотр безглавых браузеров, запланированные программные клиенты и агенты.

Ответ 11

Я бы рекомендовал обстреливать отдельные потоки для этого.

Ответ 12

Я просто наткнулся на асинхронный HTTP-клиент, реализованный в Geronimo. Вы также можете взглянуть на него, http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - Предостережение: последнее совершение кажется старше года.

Другим проектом, создающим асинхронный HTTP-клиент, является xsocket: xsocket.sourceforge.net

Ответ 13

Asyncweb предоставляет асинхронный клиент http вместе с его http-сервером. Доступно для загрузки из следующего местоположения:

https://svn.apache.org/repos/asf/mina/asyncweb/trunk