![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| mmmike |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.10.2006 Репутация: нет Всего: нет |
Такой вопрос к community: можно ли давать несколько запросов в один сокет в Java.
Сейчас меня интересует http-протокол. Я попробовал разные варианты. Давал в первом запросе заголовок Connection: keep-alive, Conent-Length ... Пока что результат таков: первый запрос проходит и возвращается ответ на него. После этого ответа я пишу второй запрос в сокет, но он не достигает веб-сервера. Что нужно, чтоб следующий запрос отправлялся на сервер? Это сообщение отредактировал(а) mmmike - 13.10.2006, 16:49 |
|||
|
||||
| y3u |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 9.9.2006 Где: Москва Репутация: нет Всего: 13 |
какая версия жабы?
вот под Тигру статейка... по идее и в более ранних жабах должно работать... Это сообщение отредактировал(а) y3u - 12.10.2006, 18:01 -------------------- В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|||
|
||||
| mmmike |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.10.2006 Репутация: нет Всего: нет |
Спасибо за ссылку.
Жаба у меня - 1.5.0_05. Свойство http.keepAlive по умолчанию у меня было null. Пробовал я юзать свойства, описанные в статье (то-есть http.keepAlive и http.maxConnections), без эффекта |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
А вы вручную http делаете? Создаете сокетное соединение, потом пишете туда все необходимые для http протокола заголовки? Почему не воспользоваться стандартным URLConnection? А на серверной стороне тоже обычный сокет ( не сервлет) ?
Насколько я понимаю, keepAlive - это всего лишь рекомендация не закрывать соединение. Программист указывает, что будут повторные запросы на текущий адрес. Если приемная и передающая сторона, а также прокси, если есть, поддерживают этот механизм, то они и сами могут это реализовать, даже если не указывать keepAlive. Или нет? Иначе какой смысл в maxConnections. Выглядит, как пул соединений, и после того как отправлен запрос и получен ответ, соединение закрывается, но на самом деле оно возвращается в пул. Так возможно это реализовано в URLConnection. |
|||
|
||||
| mmmike |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.10.2006 Репутация: нет Всего: нет |
Я пробовал запросы давать вручную.
Пробовал и URLConnection, но может не очень умело. То есть не надо писать несколько запросов в одно открытое соединение? Можно его закрывать, тогда оно пойдет в пул и будет использоваться на следуещем этапе? А как мне знать, действительно ли соединение уходит и берется из пула? И как мне задействовать такой режим? Юзать хедер Connection: keep-alive наверно? |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Если у вас на сервере используется сервлет , а в клиенте URLConnection, то надо делать как в учебнике - открыл URLConnection, послал запрос, прочитал ответ, закрыл. А с соединениями они сами разберутся (закрывать их или в пул класть).
А зачем вам узнавать используется ли keep-alive? Конечно, интересно и, наверное, можно узнать. Но вот вы узнали что у вас в тесте на локальной машине это работает. Но это не гарантия, что у реального клиента, который возможно сидит за прокси-сервером, это сработает. В этом случае клиентское приложение создает соединение не с сервером, а с прокси (если есть), а прокси (если он один) уже создает соединение с вашим сервером. И прокси-серверу, возможно, плевать на установку keep-alive. Его так настроили. Тогда вся цепочка будет вынуждена каждый раз создавать новые соединения. Я так представляю. И еще один момент, про который обычно забываешь. Соединение открывается и параметры запроса становятся доступными в этот момент на сервере, если используется GET, поскольку параметры включены в url. Когда же мы используем POST, мы пишем параметры запроса в OutputStream после открытия соединения. Они хранятся на клиенте (никакой flush не поможет) до момента, когда мы откроем InputStream. Только в этот момент накопленные данные пересылаются на сервер. Открывая InputStream мы заявляем о том, что передача данных закончена и мы перешли к приему. Отправить что-то через OutputStream после открытия InputStream уже невозможно. Это сообщение отредактировал(а) COVD - 13.10.2006, 22:12 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |