Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как установить сеанс, Need HELP 
V
    Опции темы
eXcile
Дата 14.3.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 8.2.2007

Репутация: нет
Всего: 5



Hi all!

Возникла следующая проблема:
При подключении к серверу, передача данных происходит один раз. Т.е. от клиента идут данные-> 
на сервлете обрабатываются и обратно апплету.

На сервлете создается сессия
Код

HttpSession session = request.getSession(true);

Но клиента сервак не запоминает

В апплете создается поток, который каждые 2 секунда генерирует передачу данных и соответственно ждет ответа. 

В init() cоздается само подключение
Код

public void init(){
        ta=new TextArea();
        add(ta);
        
        try{
            murl = new URL("http://localhost:8080/test/hello");
        }catch(MalformedURLException e){}
      try{
            myurl=murl.openConnection();
            myurl.setDoInput(true);
            myurl.setDoOutput(true);
            myurl.setUseCaches(false);
            myurl.setRequestProperty("Content-Type","application/x-java-serialized-object" );
            
            myurl.connect();
            
        }catch(IOException e){}
        
        try{
            timer = new Thread(this);
            timer.start();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }


После первой отправки и получения данных возникает исключение
Цитата

java.net.ProtocolException: Cannot write output after reading input.
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
    at cronus.update(cronus.java:111)
    at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239)
    at sun.awt.RepaintArea.paint(RepaintArea.java:216)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:301)
    at java.awt.Component.dispatchEventImpl(Component.java:4486)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


если же перед каждой отправкой/приемкой данных вставить подключение к серверу все работает.
Код

public void update(Graphics g) {
        Date tt=new Date();
        ta.append("Time of send: "+tt.toString()+"\n");
------------------------------------------------------------------------------------------->
       try{
            murl = new URL("http://localhost:8080/test/hello");
        }catch(MalformedURLException e){}
        
        try{
            myurl=murl.openConnection();
            myurl.setDoInput(true);
            myurl.setDoOutput(true);
            myurl.setUseCaches(false);
            myurl.setRequestProperty("Content-Type","application/x-java-serialized-object" );
                        
            myurl.connect();
        }catch(IOException e){}
<---------------------------------------------------------------------------------------------

        try { 
         
         outstream = myurl.getOutputStream();
         if(outstream!=null){
             oos = new ObjectOutputStream(outstream);
             oos.writeObject(tt);
         }

            is= myurl.getInputStream();
            if(is!=null){
             inputFromServlet = new ObjectInputStream(is); 
             tt = (Date) inputFromServlet.readObject();
             ta.append("Time of get: "+tt.toString()+"\n");
             inputFromServlet.close();
             oos.flush(); 
             oos.close();
            }
         
        } catch (Exception ex) { 
            ex.printStackTrace(); 
            ex.getMessage();
            
        } 
        
    }


Почему при каждой отсылке данных, нужно коннектиться к серваку?  Как решить эту проблему?

 smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile 

Это сообщение отредактировал(а) eXcile - 14.3.2007, 11:04
--------------------
Не становитесь рабом шаблона [Винсент Ван Гог]
PM MAIL   Вверх
kkorsakoff
Дата 14.3.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 коннект и не создается каждый раз, но тебя как программиста это не должно интересовать. А чем не устраивает текущее положение дел?smile
PM MAIL WWW ICQ   Вверх
eXcile
Дата 14.3.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 8.2.2007

Репутация: нет
Всего: 5



Цитата(kkorsakoff @  14.3.2007,  11:04 Найти цитируемый пост)
 А чем не устраивает текущее положение дел?


Приложение только пишется и отлаживается. В дальнейшем сервак возможно будет поставлен в INet'e, а такое соединение никуда негодится (не хотелось бы чтоб Юзвери коннектились по тысячу раз).

(:
При отладке наткнулся на следующую вещь: при создании сессии в doPost() header jsessionid не создавался, когда сессия создается в doGet() header jsessionid появляется. Почему?

Это сообщение отредактировал(а) eXcile - 14.3.2007, 13:06
--------------------
Не становитесь рабом шаблона [Винсент Ван Гог]
PM MAIL   Вверх
Predator83
Дата 14.3.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 16.12.2006

Репутация: нет
Всего: нет



При post запросе данные передаются в теле запроса, а при get - в заголовке.
PM   Вверх
kkorsakoff
Дата 15.3.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 6
Всего: 14



Цитата(eXcile @ 14.3.2007,  11:32)
Цитата(kkorsakoff @  14.3.2007,  11:04 Найти цитируемый пост)
 А чем не устраивает текущее положение дел?


Приложение только пишется и отлаживается. В дальнейшем сервак возможно будет поставлен в INet'e, а такое соединение никуда негодится (не хотелось бы чтоб Юзвери коннектились по тысячу раз).

(:
При отладке наткнулся на следующую вещь: при создании сессии в doPost() header jsessionid не создавался, когда сессия создается в doGet() header jsessionid появляется. Почему?

1. Установление нового соединения = 3 IP пакета по 40 байт плюс Http запрос/ответ. Что за такое приложение, где это критично?smile Не парься по этим поводам, лучше больше думай о бизнес логике, не заморачиваясь такими вещами, пока это не стало серьезной проблемой в производительности.


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
PM MAIL WWW ICQ   Вверх
pantera
Дата 15.3.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



Цитата(kkorsakoff @  15.3.2007,  12:09 Найти цитируемый пост)
Насчет второй части твоего сообщения не очень понял. Ты хочешь сказать, что если ты делал POST запрос - сервер не ставил Set-Cookie: jsessionid....?


Т.е. В сервлете отрабатывается только метод doPost(). В нем создается сессия:
Код

        HttpSession session = request.getSession(true); 
        if (session.isNew()) session.invalidate();


При отладке апплета, sessionid не существует. Если же создам сессию в doGet, то этот параметр появляется.

У меня происходит передача/прием только объектного потока (учавствует только одна html-ка которая загружает данный апплет, остальное ВСЁ лежит на апплете), поэтому я отрабатываю только метод doPost(). Вообще хотелось бы как-нибудь создать один раз соединение, и до завершения сеанса иметь возможность только передавать/принимать данные.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.