Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Чат PHP+Flash+MySQL: как опеределить наличие пользователя в чате? (http://www.flasher.ru/forum/showthread.php?t=87384)

K@@ 03.11.2006 19:58

Чат PHP+Flash+MySQL: как опеределить наличие пользователя в чате?
 
Привет!
Собственно, в заголовке и весь вопрос, но немного поясню:
Есть чат, он вполне работает, но когда пользователь внезапно отключается от чата или от сети, у меня его имя продолжает висеть в числе пользователей.
Сначала я хотел использовать socket на PHP, но из-за недостаточности опыта в работе с сокетами, он у меня получился очень сырой и жутко глючный. Пришлось отказаться, ума не хватило.

Может быть использовать XMLSocket? Но тогда как? Я даже не знаю в каком направлении копать...

Может ли кто-нибудь помочь в таком вопросе?
Как сразу же после отключения пользователя (т.е. без задержек), в том числе и внезапного отключения, определить что его уже нет?

Спасибо.

Bright 03.11.2006 20:14

вообще такое делают по последней активности, но там не избежать задержек...

K@@ 03.11.2006 20:44

Bright, а может заставить клиента постоянно посылать на сервер небольшое сообщение о присутствии. А сервер, если не получит через заданный промежуток сообщение, будет уверен, что клиента уже нет.
Не будет ли это большой нагрузкой на сервер?
И вообще в плане надежности - такое возможно или нет?

И про последнюю активность - можно подробнее?

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

Bright 04.11.2006 17:10

большая-небольшая, но это пустая нагрузка на сервер...

последняя активность - время последнего действия (вход/выход, сообщение, просмотр инфы и тд...) юзером. Если юзер в течении минуты-двух ничего не делает его выкидывают из чата.

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

Skubent 08.11.2006 12:41

Каа, а насколько сильно ты удивишься, если узнаешь, что пользователь "в чате" находится крайне малое время, примерно такое, какое нужно серверу чтобы сгенерировать ответ "Ок" ?
И отключение пользователя - если, конечно, речь не идет о клиент-серверном приложении, а о встроенном в браузер флэш-объекте - происходит в тот момент, когда пользователь (его браузер) отослал на сервер "Connection: close", то есть каждый клик мышой на ссылке и на каждый вызов getURL() и им подобных.

K@@ 08.11.2006 18:03

Skubent,
Цитата:

если, конечно, речь не идет о клиент-серверном приложении, а о встроенном в браузер флэш-объекте
Именно о нем речь и идет.

Да, я понимаю про "крайне малое время" и совсем не удивился этому.

Цитата:

происходит в тот момент, когда пользователь (его браузер) отослал на сервер "Connection: close"
Это в случае завершения работы так как положено. А вот если, скажем электричество внезапно отрубили или комп решил сходить в перезагрузку - это уже нештатная ситуация. Как тут быть? Кто отправит на сервер "Connection: close"? Если в чате скажем человек 100 сидит, то опрашивать всех - это не вариант, хотя мож быть я и ошибаюсь.

Жаль, но я так и не получил ответа на вопрос. Неужели никто не сталкивался с этим вопросом? Кто-нибудь нашел решение?

Bright,
Цитата:

насчет исходников - можно и на флэшере поискать, такие темы были, там были исходники. может, что попроще найдется.
Поискал. Не нашел. Я плохо искал?

Skubent 09.11.2006 12:38

Забудь про сбой питания. Шанс того, что питание отпадет именно в тот момент, в который в сеть уходит пакет с куском заголовка сообщения равен нулю. Можешь поэкспериментировать, торкая в ресет при общении с каким либо сервером.
А закрытие соединения отправляется при КАЖДОМ запросе от пользователя.

При перезагрузке соединения таки закрываются.

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

Bright 09.11.2006 17:50

Хм... Может быть...

В исходниках нет?

могу еще у себя посмотреть.


Часовой пояс GMT +4, время: 23:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.