![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| eXcile |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 8.2.2007 Репутация: нет Всего: 5 |
Hi all!
Возникла следующая проблема: При подключении к серверу, передача данных происходит один раз. Т.е. от клиента идут данные-> на сервлете обрабатываются и обратно апплету. На сервлете создается сессия
Но клиента сервак не запоминает В апплете создается поток, который каждые 2 секунда генерирует передачу данных и соответственно ждет ответа. В init() cоздается само подключение
После первой отправки и получения данных возникает исключение
если же перед каждой отправкой/приемкой данных вставить подключение к серверу все работает.
Почему при каждой отсылке данных, нужно коннектиться к серваку? Как решить эту проблему? Это сообщение отредактировал(а) eXcile - 14.3.2007, 11:04 --------------------
Не становитесь рабом шаблона [Винсент Ван Гог] |
||||||||
|
|||||||||
| kkorsakoff |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 378 Регистрация: 18.10.2005 Где: Санкт-Петербург Репутация: 6 Всего: 14 |
На сервере все делаешь правильно, но на клиенте сессия не сохраняется.
Есть два механизма сохранения сессии (кукисы и через специальный вид урла, включающий jsessionid), в случае браузера - он сам поддерживает эти механизмы. Если ты создаешь коннекты сам, тебе надо и отслеживать сессию. Первый вариант - использовать apache HttpClient вместо Url.openConnection(). В нем это все уже есть. Но он весит дополнительные X мегабайт, что в апплете нежелательно. Второй вариант - при выполнении самого первого запроса запомни куки, которые тебе вернул сервер. (перебор URLConnection.getHeaderFields() на предмет заголовка "Set-Cookie") . Тебе нужен куки под названием jsessionid. Запомни его значение. Затем в каждом последующем запросе вставляй в запрос. URLConnection.setHeaderField("Cookie",...) P.S. В Java1.6 механизм кукисов вроде был упрощен Добавлено @ 11:05 Почитай тут с примерами кода http://www.hccp.org/java-net-cookie-how-to.html Добавлено @ 11:07 P.S. Коннектиться надо каждый раз потому что так устроен протокол HTTP (запрос-ответ). На самом деле вполне возможно что реальный TCP коннект и не создается каждый раз, но тебя как программиста это не должно интересовать. А чем не устраивает текущее положение дел? |
|||
|
||||
| eXcile |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 8.2.2007 Репутация: нет Всего: 5 |
Приложение только пишется и отлаживается. В дальнейшем сервак возможно будет поставлен в INet'e, а такое соединение никуда негодится (не хотелось бы чтоб Юзвери коннектились по тысячу раз). (: При отладке наткнулся на следующую вещь: при создании сессии в doPost() header jsessionid не создавался, когда сессия создается в doGet() header jsessionid появляется. Почему? Это сообщение отредактировал(а) eXcile - 14.3.2007, 13:06 --------------------
Не становитесь рабом шаблона [Винсент Ван Гог] |
|||
|
||||
| Predator83 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 16.12.2006 Репутация: нет Всего: нет |
При post запросе данные передаются в теле запроса, а при get - в заголовке.
|
|||
|
||||
| kkorsakoff |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 378 Регистрация: 18.10.2005 Где: Санкт-Петербург Репутация: 6 Всего: 14 |
1. Установление нового соединения = 3 IP пакета по 40 байт плюс Http запрос/ответ. Что за такое приложение, где это критично? 2. Возможно, новое соединение и не устанавливается каждый раз (есть такая вещь, как http Connection: Keep-Alive) Вроде бы она реализована как раз в HttpClient от Jakarta http://jakarta.apache.org/commons/httpclient/index.html Хороший пакет. Очень рекомендую ознакомиться, если собираешься хоть сколько работать с Http-протоколом. Стандартная Sun'овская реализация написано ужасно примитивно. Насчет второй части твоего сообщения не очень понял. Ты хочешь сказать, что если ты делал POST запрос - сервер не ставил Set-Cookie: jsessionid....? Это сообщение отредактировал(а) kkorsakoff - 15.3.2007, 12:15 |
|||
|
||||
| pantera |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 30.1.2007 Репутация: нет Всего: нет |
Т.е. В сервлете отрабатывается только метод doPost(). В нем создается сессия:
При отладке апплета, sessionid не существует. Если же создам сессию в doGet, то этот параметр появляется. У меня происходит передача/прием только объектного потока (учавствует только одна html-ка которая загружает данный апплет, остальное ВСЁ лежит на апплете), поэтому я отрабатываю только метод doPost(). Вообще хотелось бы как-нибудь создать один раз соединение, и до завершения сеанса иметь возможность только передавать/принимать данные. |
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |