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

Для функции a -> Integer разрешено только одно поведение - возвращать постоянное целое число. Зачем? Потому что вы понятия не имеете, что такое тип a. Без каких-либо ограничений, это может быть абсолютно все, и поскольку Haskell статически типизирован, вам нужно разрешить все, что связано с типами во время компиляции. Во время выполнения информация о типе больше не существует и, следовательно, с ней невозможно ознакомиться - все варианты выбора используемых функций уже сделаны.

Наиболее близким Haskell к этому типу поведения является использование классов типов - если вы создали класс типов с именем Foo с одной функцией:

class Foo a where
    foo :: a -> Integer

Тогда вы можете определить экземпляры этого типа для разных типов.

instance Foo [a] where
    foo [] = 0
    foo (x:xs) = 1 + foo xs

instance Foo Float where
    foo 5.2 = 10
    foo _ = 100

Тогда, пока вы можете гарантировать, что какой-то параметр x является Foo, вы можете вызвать foo для него. Это все еще нужно, хотя вы не можете написать функцию

bar :: a -> Integer
bar x = 1 + foo x

, поскольку компилятор не знает, что a является экземпляром Foo. Вы должны сказать это или опустить сигнатуру типа и позволить ей понять это для себя.

bar :: Foo a => a -> Integer
bar x = 1 + foo x

Haskell может работать только с таким количеством информации, которое есть у компилятора о типе чего-либо. Это может показаться ограничительным, но на практике классы типов и параметрический полиморфизм настолько мощны, что я никогда не пропускаю динамическую типизацию. На самом деле, меня обычно раздражает динамическая типизация, потому что я никогда не совсем уверен, что на самом деле является чем-либо.

18
задан poundifdef 18 June 2009 в 19:02
поделиться

12 ответов

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

5
ответ дан 30 November 2019 в 06:42
поделиться

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

. Также посмотрите на WGET-java внутренности кода блокировки.

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

1
ответ дан 30 November 2019 в 06:42
поделиться

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

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

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

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

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

1
ответ дан 30 November 2019 в 06:42
поделиться

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

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

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

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

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

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

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

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

6
ответ дан 30 November 2019 в 06:42
поделиться

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

0
ответ дан 30 November 2019 в 06:42
поделиться

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

1
ответ дан 30 November 2019 в 06:42
поделиться

Нет, Графика Объект не содержит данных изображения, он используется для рисования на холсте, которым обычно является экран или объект Bitmap .

Итак, вам необходимо создать Bitmap объект с правильным размером для рисования и создайте объект Graphics для этого растрового изображения. Тогда вы можете сохранить это. Помните, что объект, реализующий IDisposable , должен быть удален, В этой статье обсуждается асинхронный HTTP на основе HttpClient с именем xLightweb

1
ответ дан 30 November 2019 в 06:42
поделиться

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

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

0
ответ дан 30 November 2019 в 06:42
поделиться

HTTP-клиент Jetty является асинхронным.

6
ответ дан 30 November 2019 в 06:42
поделиться

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

8
ответ дан 30 November 2019 в 06:42
поделиться

Используйте "Async Http Client", ранее называвшийся клиентской библиотекой ning http. См. http://code.ning.com/2010/03/introduction-nings-asynchronous-http-client-library/

Теперь доступно на GitHub {{1 }} https://github.com/ning/async-http-client

15
ответ дан 30 November 2019 в 06:42
поделиться

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

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

0
ответ дан 30 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: