Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/23: Рейтинг темы: голосов - 23, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457

Закрыть апплет

01.02.2010, 20:54. Показов 4550. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Давно бьюсь с проблемой.
У нас клиент - апплет. Когда юзер закрывает браузер, то апплет должен послать сообщение на сервер о своей смерти. Но не всегда успевает. Конечно, на сервере есть процесс, который отслеживает всех клиентов, и если клиент некоторое время не подает признаков жизни, то такого клиента сервер считает отсоединившимся.
Но хотелось бы, чтобы апплет всегда успевал явно сообщить о своем закрытии.
Понятно, что для этого предусмотрены методы stop и destroy. Но тут еще, как я понял, влияет в каком окне бегает апплет. Если кроме окна с апплетом открыты другие окна браузера, то есть шанс, что дестрой сработает, потому что виртуальная машина не рушится. Если апплет открыт в единственном окне, то при его закрытии умирает и виртуальная машина и ей не до апплета (ставил в дестрой wait, которое снимается после посылки сообщения на сервер, но и это не помогает).
Вот такая у меня гипотеза. Или все-таки это ошибки программирования?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2010, 20:54
Ответы с готовыми решениями:

Апплет
import java.awt.*; import java.applet.*; import java.io.BufferedReader; import java.io.IOException; import...

Апплет
Добрый день. В университете начали проходить Java. Есть несколько лаб, последней из которых является лаба по апплетам. Дак вот. Я...

Апплет
Здравствуйте! Мне нужно создать апплет - при вводи в текстовое поле температуры по Фаренгейту -в другом поле появл. темп-ра по Цельсию. ...

36
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
01.02.2010, 21:40
http://java.sun.com/docs/books/tutorial/applet/overview/lifeCycle.html
Здесь пишут об известных проблемах при загрузке апплетов. Про выгрузку ничего не сказано. Я сам, работая с апплетами, тоже не наблюдал такой проблемы. Правда отправлять мне ничего никуда не приходилось. Более конкретно ничего сказать не могу, к сожалению.
0
mishgun
02.02.2010, 03:20
Попробуйте поэкспериментировать с методами stop() И destroy()(если не ошибаюсь)
mishgun
02.02.2010, 05:48
автор прости великодушно не прочитал толком твой пост
mishgun
02.02.2010, 05:50
По идее дестрой должен срабатывать в любом случае если ты его перепишещ
mishgun
02.02.2010, 05:58
О! Идея возникла при самоуничтожении аппдета первым вызывается stop() и только потом destroy() а что если сообщать серверу в stop а не в destroy?
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
02.02.2010, 16:48  [ТС]
Я это как раз и пробовал. Посылаю комаду о закрытии из стопа() (и из дестроя пробовал) и ставлю ожидание wait. После того, как команда отправлена, делаю notify. Если кроме окна, где открыт апплет, открыты другие окна, то в java консоли я вижу, как выполнение функции стоп останавливается и после посылки команды возобновляется благодаря notify. Все работает, как в учебниках . Но если было открыто только одно окно браузера, то с его закрытием и консоль закрывается, и посмотреть ничего нельзя (на сервер команда не приходит). Из чего я сделал предположение, что JVM умирает и хоронит все под собой. Возможно, это зависит еще и от версии браузера и виндоуз.
Есть еще идея (пока только идея) перенять технологию порносайтов (когда закрываешь одно окно, то выскакивает другое), т.е. чтобы при закрытии не апплет послал сигнал, а сам браузер сообщил на сервер о кончине.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
02.02.2010, 17:13
У меня встречный вопрос: зачем? Зачем необходимо знать о том, что браузер закрылся? Ни разу не возникало ситуации, чтобы нельзя было это разрулить. Я не спорю, очень удобно знать, когда юзер закрыл сессию. Но это обходится ) Мне на самом деле интересно.
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
02.02.2010, 20:40  [ТС]
Согласен, это наверняка обходится.
У нас на сервере есть процесс который отключает юзеров не подающих признаков жизни некоторое время. Сервер не позволяет юзеру одновременно два апплета под одним именем открывать. Если юзер минимизировал окно апплета и потерял его, потом по новой коннектится, ему будет отказано. Или он случайно закрыл (но закрыл неудачно) и тут же опять в систему лезет, а сервер его не пускает, так как старая сессия еще живая. Пройдет некоторое время, когда сервер его опять пустит, и клиенту это надо обьяснять, а лучше такие ситуации исключить.
Наверное, тут можно и сценарий взаимодействия сервера с клиентом как-то оптимизировать и тут наверняка есть обкатанные решения. Буду благодарен за информацию.
0
0 / 0 / 0
Регистрация: 22.07.2009
Сообщений: 457
02.02.2010, 21:17  [ТС]
Еще добавлю про причину интереса к этому гурманству. Когда на сервере появляется сообщение, что система кого-то отсоединила, то точно неизвестно, то ли юзер сам закрылся добровольно и с песнями (но неудачно), то ли действительно проблемы.
0
mishgun
03.02.2010, 05:57
А ты не пробовал просмотреть всё то же самое но не из под консоли браузера а из под ДОСа например? то есть из под appletviewer?
По идее любая программа выполняется построчно то есть выполнилась строка идем дальше попробуй просмотреть из под вьюера или в крайняк пиши пока в какой нить текстовый файл чисто для отладки...
1 / 1 / 2
Регистрация: 07.01.2010
Сообщений: 128
03.02.2010, 08:53
Вопрос в следующем: раз нужно узнавать о смерти апплета, значит, тот апплет висит у пользователя достаточно долго. Раз висит долго, значит, вероятно, обменивается данными с сервером. Раз обменивается данными, значит, наверное, открывает какую-то коннекцию. Если она делается через socket, то почему бы не отслеживать 'живость' апплата по этой коннекции? Или там у вас HTTP-тунеллирование?
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
03.02.2010, 10:10
На самом деле проблема важная. Даже в случае обычного сетевого подключения к базе данных (например Oracle) иногда сеансы могут висеть очень долго пожирая ресурсы.
Если вырубать клиента по таймауту, то можно случайно отключить клиента, который как буриданов осел долго не может принять решение и морщит лобик сидя за компьютером в бездействии. При работе в HTTP когда связь практически односторонняя это и вовсе - проблема : как отследить - жив клиент или уже мертв. Если это Интернет, ну и черт с ним. Если это Интранет может привести к коллизии потери важной информации.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
03.02.2010, 10:47
3 mselez:
> [...] Сервер не позволяет юзеру одновременно два апплета под одним именем открывать.
Понятно, что сервер не сам собой позволяет только с одним экземпляром апплета юзеру работать, а разработчики хотят сделать так, чтобы приложение (под приложением я понимаю совокупность всех его компонент: и апплеты, и сервлеты, и логика, и БД) не позволяло открывать одному пользователю два экземпляра с пересекающимися временами жизни. Вопрос: почему? Почему вы хотите запретить открывать два апплета? Я уверяю, что ответ на этот вопрос может многое прояснить, и ОЧЕНЬ вероятно, что можно будет выбрать альтернативное решение, которое БУДЕТ УДОВЛЕТВОРЯТЬ решаемой задаче.

2 mbasil:
> [...] Даже в случае обычного сетевого подключения к базе данных (например Oracle) иногда сеансы могут висеть очень долго пожирая ресурсы.
Согласен, что держать соединение с БД, и не производить никаких операций с ней -- очень дорого. И не надо так делать. Выполнил запрос -- закрыл соединение. Да, открывать и закрывать соединения дорого. Пулируем. Известно, что примерно только 10% пользователей из всех, в данный момент работающих с приложением, в данный же момент выполняют запросы к БД. Если одновременно подключено к приложению 100 юзеров, то только десятерым из них необходмо соединение. Значит мщности пула в 10 соединений достаточно. Причем интелектуальный пул, который сам адаптируется к нагрузке -- задача простая и решенная во множестве вариантов. И этим надо пользоваться )
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
03.02.2010, 12:30
To Danissimo
Напрасно Вы объясняте, как работает пул подключений, поскольку я не настолько безграмотен. Пуд подключений к поднятому вопросу никакого отношения не имеет. Я хотел ЛИШЬ подчеркнуть, что вопрос поднятый в топике был проблемой 'И' в режиме клент-сервер, а сейчас при использовании сложных форм в Интранет - это просто АРХИактуально и решение заинтересуют всех (меня в том числе).
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
03.02.2010, 12:48
Согласен, что к поднятому вопросу пол соединений отношения не имеет. Я отвечал не на поднятый вопрос, а на пост от '27.11.2003 10:33'. Может быть я не понял, о чем речь -- обясняться по этому поводу больше нет смысла. Проехали...

Но. Вы все пытаетесь решить задачу, как заставить апплет сообщать о том, что он выгружен. Я же пытаюсь выяснить у вопрошающего, зачем ему надо, чтобы апплет так поступал. А веб-приложение и клиент-сервер -- разные оперы. И если кто-то в веб-приложении использует архитектуру клиент-серверного приложения, тогда-то и возникают проблемы с открытыми соединениями (если говорить про соединения ).

Я не отрицаю, что, да, действительно для решения исходной задачи нужно решить задачу с единтсвенностью апплета. Но для этого я хочу услышать эту исходную задачу.
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
03.02.2010, 13:39
Извините, несмотря на то, что 'проехали' попытаюсь нахально влезть еще раз, поскольку не все так просто.
У нас все чаще возникают противоположные требования к клиенту : он должен для работы иметь сложный 'АРМ' и 'долгоиграющий' сеанс и при этом должен еще работать через HTTP и в браузере. Ему нельзя ничего инсталировать, но при этом он должен иметь инструмент высокой сложности. Форма сложная, значит - аплет.
'Долгоигрпющий' сеанс, воленс-ноленс, организуем на сервере приложений, в ответ на короткие HTTP запросы получаем на короткое время подключение из пула. Этот самый сеанс на сервере приложений кэширует часть иформации между базой и собственно клиентом. Что делать с сеансом если клиент долго не проявляется. Вырубить с потерей информации? А обратной связи 'сервер приложений -> клиент' практически нет. Отсюда и проблема.
0
0 / 0 / 2
Регистрация: 08.04.2009
Сообщений: 271
03.02.2010, 13:52
Извините, напомню, что клиент внутренний и информация важная. Внешнего клиента можно зачастую заставить повторно проделать операцию а здесь информацию терять просто нельзя, но и 'транзакция' по-видимому не завершена.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
03.02.2010, 15:58
Все правильно. Давайте скажем все то же самое, но другими словами.

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

Я правильно понял и перефразировал задачу?

Решение.
Так как нельзя понять, оборвался канал связи или нет, то вводим время ожидания реакции от актера. Как только время истекло, делаем вывод, что канал оборвался. Это с одной стороны.

С другой стороны. Данные в хранилище переходят из одного устойчивого состояния в другое по вполне определенным на этапе проектирования системы событиям. Переход будем считать мгновенным и атомарным. Такой переход будем называть транзакцией.

Событие, переводящее хранилище из одного состояния в другое, возникает в результате поступления данных от актера, причем только тогда, когда все необходимые данные, достаточные для выполнения транзакции, приняты.

Если приняты все данные, достаточные для выполнения транзакции, выполняем ее. Что делать, если приняты не все данные, и канал связи оборвался? Помним, что актер не может воспроизвести ранее переданные данные.

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

Как приложению адекватно зваимодействовать с пользователем. Он должен иметь возможность просмотреть ранее введенные, но еще не внесенные в хранилище, данные. Если при аутентификации выясняется, что ранее переданные данные не достаточны для выполнения транзакции, сообщить ему об этом, и показать их. Как только его транзакция выполнена, сообщить ему об этом. Сообщить также о том, что данные недостаточные для выполнения транзакции, хранятся не вечночть, а четко заданное РАЗУМНОЕ время.

Все. Только так и работают приложения со stateless протоколами )
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
03.02.2010, 16:09
И еще. Меня удивило утверждение: 'Форма сложная, значит - аплет.' Да кто сказал? С какой стати? Утверждение 'Форма сложная' совсем не влечет за собой вывод 'значит -- апплет'. Апплет -- всего лишь как один из вариантов. Второй -- обычные веб-формы. Ни чем не хуже. Или есть задачи, о которых ничего не сказано, но которые можно решить только апплетом? Даже графики процесса рисовать можно, не используя апплет, если допустимо их обновлять, скажем, раз в секунду.

Короче, из того, что форма сложная, совсем не следует, что апплет -- единственное решение. Для такого решения должны быть более веские аргументы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2010, 16:09
Помогаю со студенческими работами здесь

Апплет java
Добрый день! дали следующее тестовое задание на работе: Требуется создать java апплет со свойствами: Апплет предназначен для запуска с...

Создать апплет
Создать апплет "расчет прямоугольника", который по ширине и длине прямоугольника вычисляет его периметр, площадь и длину диагонали. Апплет...

Апплет. 3D модель
Задача: Построить 3D модель строения химического элемента Тантал. В Java я новичек.

Первый апплет
Почему мой апплет не работает в броузерах? В Internet Explorer вижу просто прямоугольник, а в Opera он вообще инвалид. Только...

Апплет на сайте
Занимаюсь разроботкой сайта с технологий jsf. Необходимо разместить там апплет. Рзрабатываю в еклипсе. <applet...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru