Разбор необработанного HTTP с помощью асинхронного сокетного клиента - PullRequest
2 голосов
/ 03 мая 2011

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

Я в основном написал свой собственный асинхронный клиент http / socket , используя стандартные сокеты .NET. Я поддерживаю пул из 1024 сокетов, и у меня 128 «служебных» потоков, использующих пул сокетов для загрузки веб-страниц из Интернета со скоростью до 371 страницы в секунду (только что протестировал сегодня на одном сервере Amazon EC2). Я также сделал еще один асинхронный HTTP-клиент, который использует HttpWebRequest для асинхронной загрузки веб-страниц, но он ОЧЕНЬ медленнее: моя пропускная способность в среднем составляет около 50 страниц в секунду (также тестируется на Amazon EC2) с той же настройкой: 1024 пула HttpWebRequest s и 128 "служебных" тем.

Естественно, предоставление поддержки протокола HTTP займет немного больше вычислительной мощности и памяти. Я надеюсь, что с сервером Extra Large EC2 от Amazon меня не будут ограничивать вычислительная мощность / память, а только пропускная способность сети (что имело место до сих пор).

Примером машин, которые я использую, является очень большой экземпляр Amazon High-CPU:

  • 7 ГБ памяти
  • 20 вычислительных блоков EC2 (8 виртуальных ядер по 2,5 вычислительных блока EC2 каждое)
  • 1690 ГБ хранилища экземпляров
  • 64-битная платформа
  • Производительность ввода / вывода: высокая
  • Имя API: c1.xlarge

Я могу написать свою собственную обработку HTTP, которая соответствует протоколу HTTP, но это избавит меня от ТОННЫ работы, боли и страданий, если будет готовое и надежное решение.

Мне нужны как минимум следующие функции:

  • Создание запросов HTTP HEAD / GET (и, возможно, POST)
  • Разбор ответа HTTP из двоичного потока
  • Поддерживает куки
  • Лицензия LGP (LGPL)

Кто-нибудь знает такие решения?

1 Ответ

3 голосов
/ 04 мая 2011

Я не знаю, как HttpWebRequest работает с сокетами внутри.Открытые / закрывающиеся сокеты могут быть хитом производительностиWebClient использует keep-alive и может работать лучше.

Редактировать: Я немного погуглил и не принял бы это как ответ.Кажется, WebClient является оболочкой для HttpWebRequest / Response: http://www.codeproject.com/Articles/156610/WP7-WebClient-vs-HttpWebRequest.aspx?msg=3775084

Обновление

Поскольку вы начали с сокетов, я бы придерживался их.Не стесняйтесь брать материалы из моего проекта веб-сервера: http://webserver.codeplex.com

Мой анализатор:

http://webserver.codeplex.com/SourceControl/changeset/view/56552#671689

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...