Ответ 1
Используйте "Async Http Client", ранее называемую клиентской библиотекой ning http. Видеть http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/
Теперь доступен в GitHub https://github.com/ning/async-http-client
Являясь относительным новичком в мире 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
}
Используйте "Async Http Client", ранее называемую клиентской библиотекой ning http. Видеть http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/
Теперь доступен в GitHub https://github.com/ning/async-http-client
Версия 4.0 Apache Commons HttpClient (теперь в HttpComponents/HttpCore) также поддерживает Java NIO (неблокирующий IO). Я думаю, что это ваш лучший выбор.
Если вы еще не посмотрели на него, проверьте 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, это то, что обрабатывает пул соединений, и это не показано в самом базовом примере.
Похоже, вы хотите (часть) NIO - там хороший учебник здесь, асинхронная сетевая часть начинается с p. 30, и в конце есть много полезных ссылок.
Jetty HTTP client является асинхронным.
существуют библиотеки и фреймворки, написанные поверх 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");
}
}
вы можете найти полный код примера с здесь
Итак, вероятно стоит подумать, что ActionScript и Java не поддерживают одну и ту же нишу. Например, Java делает некоторые вещи более утомительными - но обычно это дает пользователю больше опций в том, как, например, выполняется HTTP-соединение, в то время как ActionScript может абстрагировать детали или возможные ошибки для удобства использования. Но, ваша точка все еще стоит.
Я сам не знаю асинхронного HTTP-клиента для Java. Алекс Мартелли отвечает на вопросы о Java NIO, что является хорошим ответом, если вы заинтересованы в реализации протокола HTTP в своем собственном коде. NIO позволит вам использовать сокеты для подключения к веб-серверу - но тогда вам нужно вручную создать свои собственные запросы GET и проанализировать входящие HTTP-заголовки/данные.
Другим вариантом является использование классов java.net.URL - и вы можете найти множество руководств для тех, кто находится в сети и в stackoverflow. Вы можете обернуть их в потоки, поэтому ваша Java-программа имеет несколько потоков выполнения.
Но тогда вы столкнулись с проблемой синхронизации. Я согласен, это боль, но тогда он предлагает более гранулированный уровень гибкости.
(Я понимаю, что это не отвечает на ваш вопрос - и если кто-нибудь действительно знает о возможности java для асинхронных HTTP-запросов, мне было бы интересно узнать!)
AFAIK инструмент TCPMon использует аналогичный подход к тому, что вы описываете. Вы можете взглянуть на исходный код в SVN-браузере
Также посмотрите WGET-java для кишок блокирующего кода.
Но нужно ли писать на Java? Существует множество других подходов, использующих JRuby или Rhino для выполнения чего-то подобного, который будет работать на JVM, но не написан на Java.
httpunit и htmlunit являются 2 настраиваемыми и настраиваемыми HTTP-клиентами Java, способными к чему-либо в браузере, таким как имитация firefox, просмотр безглавых браузеров, запланированные программные клиенты и агенты.
Взгляните также на http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html В этой статье обсуждается async HTTP на основе HttpClient с именем xLightweb
Я бы рекомендовал обстреливать отдельные потоки для этого.
Я просто наткнулся на асинхронный HTTP-клиент, реализованный в Geronimo. Вы также можете взглянуть на него, http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - Предостережение: последнее совершение кажется старше года.
Другим проектом, создающим асинхронный HTTP-клиент, является xsocket: xsocket.sourceforge.net
Asyncweb предоставляет асинхронный клиент http вместе с его http-сервером. Доступно для загрузки из следующего местоположения: