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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать запуска второй копии программы, Если прокрамма использует сокет по назна 
V
    Опции темы
batigoal
Дата 1.4.2013, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



koreyko, тебе не нужно получать доступ к чужому фрейму - это сам первый экземпляр программы слушает события на порту, и, получив сообщение от запущенного второго инстанса, разворачивает себя. Второй же экземпляр после получения сообщения тихо завершается.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
koreyko
Дата 2.4.2013, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



batigoal, вы уверены? Потому что COVD писал, цитирую: "Когда вторая инстанс стартует, первая закрывается командой System.exit(0)"
PM MAIL   Вверх
batigoal
Дата 2.4.2013, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



koreyko, да, но выполняет-то этот System.exit сам инстанс, который будет выключен: 

Код

else if (command.equals(COMMAND_SHUTDOWN)) {//shutdown this application by command from another application    
                        System.out.println("app exits");
                        System.exit(0);
                    }


Программа получила сообщение и завершила себя.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
COVD
Дата 3.4.2013, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



koreyko
У меня действительно так сделано, что при запуске второго инстанса он шлет команду первому инстансу и первый сам себя закрывает по этой команде.  Я привел код, на основе которого вы можете реализовать свою логику, например, второй закрывается, а первый разворачивается. 
PM MAIL   Вверх
koreyko
Дата 3.4.2013, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



COVD,  еще раз спасибо. Разобрался, всё у меня получилось. Я раньше никогда не работал с сокетами и серверами, поэтому у меня осталась пара вопросов:

- что такое readTimeout, равный 2-м секундам и зачем он нужен? Насколько я понял, это диапазон, через который сервер слушает приходящие команды, или нет? Заметил такую ситуацию: если быстро запустить приложение 2 раза, то остаются запущенными две копии. Как с эти можно бороться?
- каким образом надо выбирать диапазон портов? Если все они оказались до этого заняты другими процессами, то данное решение не сработает? Или же это порты относятся только к запущенному серверу и они всегда свободны?
PM MAIL   Вверх
COVD
Дата 3.4.2013, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Цитата

- что такое readTimeout, равный 2-м секундам и зачем он нужен?


Поток, читающий из сокета, блокируется, если нет данных (если сокет в блокирующем режиме). Таймаут на чтение определяет максимальное время ожидания данных. Если данных нет большее время, то выбрасывается исключение, и поток разблокируется. Это событие на принимающей стороне (на клиенте) означает, что коммуникация завершилась аварийно. Иначе поток может ожидать данных вечно.

2 сек - предполагается, что в локальной сети этого достаточно. Если обмен данных осуществляется через интернет, то обычно ставят секунд 15.

Цитата

если быстро запустить приложение 2 раза, то остаются запущенными две копии. Как с эти можно бороться?


Очевидно, что второе запущенное приложение начинает поиск, а первое приложение еще не успело запустить свой сервер, так как тоже ищет. Можно попробовать поменять местами операции - сначала стартовать сервер, а потом искать в сети другие инстансы.
И, наверное, надо передавать время старта в миллисек, чтобы инстансы могли понять, кто из них первый. 

Цитата

каким образом надо выбирать диапазон портов? Если все они оказались до этого заняты другими процессами, то данное решение не сработает?


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

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

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


 




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


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

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