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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> исчезает сокет 
:(
    Опции темы
3,14
  Дата 10.12.2004, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Есть примерно такой класс:
Код

public class Connector extends TimerTask
{
   Socket clarify = null;
   String host    = "host";
   int    port    =  3434;
   String user    = "";
   String pass    = "";
   int    period  = 1000 * 60;
   java.util.Date last_connection = null;
   long   max_inactive_period     = 1000 * 60 * 3;
   
   BufferedReader clarify_in  = null;
   BufferedWriter clarify_out = null;
   Timer my_scheduler = null;
   
   public void run()
   {
      if (!isConnected())
     {
  my_scheduler.cancel();
  my_scheduler = null;
  return;
     }
     java.util.Date curr_time = new java.util.Date ();
     if (curr_time.getTime() - last_connection.getTime() > max_inactive_period)
    {
  try
  {
           disconnect();
  }
  catch(Exception e)
  {
           System.out.println("ClarifyConnector: unable to diconnect from clarify : " + e.toString());
  }
  return;
   }
 }
   
   protected void update_connection_time()
   {
     last_connection = new java.util.Date();
   }

   public ClarifyConnector(String user, String pass) throws Exception
   {
      System.out.println("ClarifyConnector initialized");
      try
      {
     this.user = user;
     this.pass = pass;
     update_connection_time();
     connect();
      }
      catch(Exception e)
      {
        System.out.println("ClarifyConnector : connection error : \n" + e.toString());
      }
   }
   
   public void disconnect() throws Exception
   {
     if (isConnected())
     {
      String command = "Goodbye\n";
      clarify_out.write(command, 0, command.length());
      clarify_out.flush();
      clarify.close();
      my_scheduler.cancel();
      my_scheduler = null;
    }
   }
   
   protected void connect() throws Exception
   {
     //connecting to clarify
  if (my_scheduler != null) my_scheduler.cancel();
  my_scheduler = new Timer();
    my_scheduler.scheduleAtFixedRate(this, 0, period);
  clarify = new Socket(InetAddress.getByName(host), port);
  if (!clarify.isConnected())
     {
       clarify = null;
       return;
     }
     
     clarify_in  = new BufferedReader(new InputStreamReader(clarify.getInputStream()));
     clarify_out = new BufferedWriter(new OutputStreamWriter(clarify.getOutputStream()));
     
   }
   
   public boolean isConnected()
   {
     return (clarify != null) && (clarify.isConnected());
   }    
   
   public void readFields(String crnumber, Hashtable tbl) throws IOException
   {
       //read some info
   }
}


В общем иннициализируется соединение, читаются некоторые данные оттуда, и затем этот класс сохраняется в пользовательской сессии (что соединение заново не открывать), тогда же обработка таймера срабатывает оказыватся что переменная clarify равна null. При этом её никто в null не устанавливал, метод disconnect не вызывали, и открытое соединение висит в воздухе (по netstat -a отображается) , в чём может быть причина?[s]

Это сообщение отредактировал(а) 3,14 - 10.12.2004, 17:30


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
AntonSaburov
Дата 10.12.2004, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



А что если у тебя он по тайм-ауту закрывается ? Там же есть SO_TIMEOUT - может по нему и вываливается.
PM MAIL WWW ICQ   Вверх
igon
Дата 10.12.2004, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Возможно, run() при срабатывании таймера выполняется в ИНОМ, нежели сохраненном у пользователя ЭКЗЕМПЛЯРЕ Connector и просто его "не видит".
Попробуй clarify объявить как static. Правда, тогда всем пользователям придется пользоваться одним сокетом. smile



--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 10.12.2004, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
Возможно, run() при срабатывании таймера выполняется в ИНОМ, нежели сохраненном у пользователя ЭКЗЕМПЛЯРЕ Connector и просто его "не видит".


Тak этo ж сервер.

Цитата
Попробуй clarify объявить как static.


Если объект цепляется к сессии, то какая разница, статик он или нет?

Может дело в таймауте, но тогда сессия былa бы null. Запости код где ты с сессией и этим объектом работаешь.


--------------------

PM   Вверх
igon
Дата 10.12.2004, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, нужен
Цитата
код, где ты с сессией и этим объектом работаешь.

Если там вместо
Код

myTimer.schedule(mySavedConnector....)

указано, скажем,
Код

myTimer.schedule(new Connector(),....)
- то прав могу быть и я smile






--------------------
Хотите поговорить об этом?
PM   Вверх
3,14
Дата 14.12.2004, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(AntonSaburov @ 10.12.2004, 18:24)
SO_TIMEOUT

пробовал менять, не помогает smile
Цитата(Domestic @ 10.12.2004, 21:32)
Запости код где ты с сессией и этим объектом работаешь.

Код

if (request.getParameter("clarify") != null)
 {
     
     ClarifyConnector clarify = null;
     if (session != null) clarify = (ClarifyConnector) session.getValue("clarify");
     if ((clarify == null) || (!clarify.isConnected()))
     {
     if (getAuthParams())
     {
      clarify = new ClarifyConnector(user, pass);
      if (!clarify.isConnected())
      {
       clarify = null;
       addTextNode("CLARIFY_ERROR", "NOT_CONNECTED");
       return;
      }
      else
      {
       session.putValue("clarify", clarify);
      }
     }
     else
     {
      response.setStatus(response.SC_UNAUTHORIZED);
      response.setHeader("WWW-Authenticate", "Basic realm=\"Clarify Auth\"");
      return;
     }
     }

Код

public boolean getAuthParams()
{
 String auth_string = request.getHeader("Authorization");
 if (auth_string == null) return false;
 StringTokenizer st = new StringTokenizer(auth_string, " ");
 String scheme = null;
 try
 {
  scheme = st.nextToken();
 
  //getting name/pass
  pass = st.nextToken();
  if (scheme.equalsIgnoreCase("BASIC"))
  {
   //decode name/pass
   pass = new String(new BASE64Decoder().decodeBuffer(pass));
  }

  st = new StringTokenizer(pass, ":");
  user = st.nextToken();
  pass = st.nextToken();
 }
 catch(Exception e)
 {
  return false;
 }
 return true;
}



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
igon
Дата 14.12.2004, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. Хотя класс называется Connector, конструктор у него ClarifyConnector
clarify = new ClarifyConnector(user, pass);
Очепятка?
2. Используются clarify типа ClarifyConnector и clarify типа Socket - несколько сбивает с толку smile
3. А где Timer, который срабатывает и не обнаруживает clarify?
Должно быть примерно так

Код

...
     else
     {
      session.putValue("clarify", clarify);
      java.util.Timer myTimer new java.util.Timer();
      myTimer.schedule(clarify, параметры первого запуска и периодичности);
      myTimer.run();
     }
...  

Ну и, наверное, надо сохранять в сессии информацию о таймере, чтобы его пересоздавать при пересоздании clarify


--------------------
Хотите поговорить об этом?
PM   Вверх
3,14
Дата 14.12.2004, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(igon @ 14.12.2004, 16:10)
Хотя класс называется Connector, конструктор у него ClarifyConnector
clarify = new ClarifyConnector(user, pass);
Очепятка?

Она самая
Цитата(igon @ 14.12.2004, 16:10)
А где Timer, который срабатывает и не обнаруживает clarify?

Сам таймер член класса ClarifyConnector, а инициализируется в методе connect этого же класса
Код

if (my_scheduler != null) my_scheduler.cancel();
  my_scheduler = new Timer();
    my_scheduler.scheduleAtFixedRate(this, 0, period);

Добавлено @ 16:18
Цитата(igon @ 14.12.2004, 16:10)
Ну и, наверное, надо сохранять в сессии информацию о таймере, чтобы его пересоздавать при пересоздании clarify

Таймер сохраняется в сессии вместе с clarify, так как это член этого класса


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
igon
Дата 14.12.2004, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Sorry, запостил - а потом и сам увидел. Но возникли проблемы со связью и не успел отозвать smile
ТОлько все равно несколько странно - таймер запускается из задания, которое запускается по этому таймеру.
Надо подумать smile


--------------------
Хотите поговорить об этом?
PM   Вверх
3,14
Дата 14.12.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(igon @ 14.12.2004, 17:18)
ТОлько все равно несколько странно - таймер запускается из задания, которое запускается по этому таймеру.

По этому таймеру запускается совершенно другое задание, проверка на то жива ли связь, а не попытка соединения, просто эти функции члены одного класса smile


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Domestic Cat
Дата 14.12.2004, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



У тебя максимальный период без активности = 3 минуты, а update_connection_time вызывается только в конструкторе. Может ты сам делаешь дисконнект после трех проходов run() (период ведь 1 секунда)?

Заодно лучхе заменить нетоды getValue/setValue нa getAttribute/setAttribute.


--------------------

PM   Вверх
igon
Дата 14.12.2004, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



my_scheduler.scheduleAtFixedRate(this, 1000, period);
Когда стоит 0 - сразу запускается run() и, т.к. Socket еще не инициализирован, таймер отключается насовсем, отработав только один раз smile


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 14.12.2004, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Короче, сам себя убивает smile


--------------------

PM   Вверх
3,14
Дата 15.12.2004, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Цитата(igon @ 14.12.2004, 20:45)
my_scheduler.scheduleAtFixedRate(this, 1000, period);
Когда стоит 0 - сразу запускается run() и, т.к. Socket еще не инициализирован, таймер отключается насовсем, отработав только один раз

Так оно и было, спасибо огромное всем откликнувшимся


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

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

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


 




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


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

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