| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Работа с сетью > Не работает HTTP keep-alive |
| Автор: mmmike 12.10.2006, 17:29 |
| Такой вопрос к community: можно ли давать несколько запросов в один сокет в Java. Сейчас меня интересует http-протокол. Я попробовал разные варианты. Давал в первом запросе заголовок Connection: keep-alive, Conent-Length ... Пока что результат таков: первый запрос проходит и возвращается ответ на него. После этого ответа я пишу второй запрос в сокет, но он не достигает веб-сервера. Что нужно, чтоб следующий запрос отправлялся на сервер? |
| Автор: y3u 12.10.2006, 18:00 |
| какая версия жабы? http://java.sun.com/j2se/1.5.0/docs/guide/net/http-keepalive.html по идее и в более ранних жабах должно работать... |
| Автор: mmmike 13.10.2006, 13:22 |
| Спасибо за ссылку. Жаба у меня - 1.5.0_05. Свойство http.keepAlive по умолчанию у меня было null. Пробовал я юзать свойства, описанные в статье (то-есть http.keepAlive и http.maxConnections), без эффекта |
| Автор: COVD 13.10.2006, 15:39 |
| А вы вручную http делаете? Создаете сокетное соединение, потом пишете туда все необходимые для http протокола заголовки? Почему не воспользоваться стандартным URLConnection? А на серверной стороне тоже обычный сокет ( не сервлет) ? Насколько я понимаю, keepAlive - это всего лишь рекомендация не закрывать соединение. Программист указывает, что будут повторные запросы на текущий адрес. Если приемная и передающая сторона, а также прокси, если есть, поддерживают этот механизм, то они и сами могут это реализовать, даже если не указывать keepAlive. Или нет? Иначе какой смысл в maxConnections. Выглядит, как пул соединений, и после того как отправлен запрос и получен ответ, соединение закрывается, но на самом деле оно возвращается в пул. Так возможно это реализовано в URLConnection. |
| Автор: mmmike 13.10.2006, 19:52 |
| Я пробовал запросы давать вручную. Пробовал и URLConnection, но может не очень умело. То есть не надо писать несколько запросов в одно открытое соединение? Можно его закрывать, тогда оно пойдет в пул и будет использоваться на следуещем этапе? А как мне знать, действительно ли соединение уходит и берется из пула? И как мне задействовать такой режим? Юзать хедер Connection: keep-alive наверно? |
| Автор: COVD 13.10.2006, 21:43 |
| Если у вас на сервере используется сервлет , а в клиенте URLConnection, то надо делать как в учебнике - открыл URLConnection, послал запрос, прочитал ответ, закрыл. А с соединениями они сами разберутся (закрывать их или в пул класть). А зачем вам узнавать используется ли keep-alive? Конечно, интересно и, наверное, можно узнать. Но вот вы узнали что у вас в тесте на локальной машине это работает. Но это не гарантия, что у реального клиента, который возможно сидит за прокси-сервером, это сработает. В этом случае клиентское приложение создает соединение не с сервером, а с прокси (если есть), а прокси (если он один) уже создает соединение с вашим сервером. И прокси-серверу, возможно, плевать на установку keep-alive. Его так настроили. Тогда вся цепочка будет вынуждена каждый раз создавать новые соединения. Я так представляю. И еще один момент, про который обычно забываешь. Соединение открывается и параметры запроса становятся доступными в этот момент на сервере, если используется GET, поскольку параметры включены в url. Когда же мы используем POST, мы пишем параметры запроса в OutputStream после открытия соединения. Они хранятся на клиенте (никакой flush не поможет) до момента, когда мы откроем InputStream. Только в этот момент накопленные данные пересылаются на сервер. Открывая InputStream мы заявляем о том, что передача данных закончена и мы перешли к приему. Отправить что-то через OutputStream после открытия InputStream уже невозможно. |