<MyRusakov.ru />

Создание крупного проекта на Java с нуля

Создание крупного проекта на Java с нуля

Данный курс научит Вас создавать крупные проекты на Java грамотно и быстро. В курсе Вы увидите создание большой и сложной программы на Java абсолютно с нуля.

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

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

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Форум сайта MyRusakov.ru

Проверка онлайн-статуса
01.11.2012 18:50:10 Проверка онлайн-статуса Сообщение #1
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

Часто нужно знать статус конкретного пользователя - залогинен он или нет. В социальных сетях показывают кто из друзей онлайн, в чатах есть список присутствующих.
Как это реализовать?

Я создал отдельную таблицу в которую добавляю запись с id пользователя, когда он авторизуется и, соответственно, удаляю эту запись, когда он жмет на кнопку Выход.

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

Я решил обойти эту проблему следующим образом. В таблицу, где содержаться записи о пользователях в онлайне я добавил поле с информацией о времени последнего обновления.

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

Таким образом, если какой-то пользователь закрыл страницу сайта более чем на 60 секунд, то он удаляется из списка "в онлайне".

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

Можно ли решить задачу более изящно?
Профиль Ответить
01.11.2012 19:10:38 Проверка онлайн-статуса Сообщение #2
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Вот самый классический вариант реализации "Кто онлайн": http://myrusakov.ru/php-who-online.html
Профиль Ответить
01.11.2012 20:33:20 Проверка онлайн-статуса Сообщение #3
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

В статье описан тот же метод, что я и предложил выше. Разница лишь в том, что в статье обновление таблицы происходит, когда кто-либо из пользователей совершает какое-либо действие(кликает по ссылке и т.п.), а я решил повесить обновление на таймер, чтобы даже тот человек, который просто открыл страницу и не на что не нажимает, видел бы как люди приходят и уходят в реальном времени.
Профиль Ответить
01.11.2012 20:45:01 Проверка онлайн-статуса Сообщение #4
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Ваш способ вполне рабочий, но вот постоянное обновление страницы может повергнуть в шок многих пользователей. Такие вещи делаются через Ajax, либо через обычную отправку POST-запросов через JavaScript, чтобы не было обновления страницы.
Профиль Ответить
02.11.2012 12:43:57 Проверка онлайн-статуса Сообщение #5
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

Через Ajax я и собирался делать. Про обновление страницы это я для простоты. Смущает большое кол-во бесполезных и регулярных запросов к серверу со стороны каждого клиента.

А что значит "обычную отправку POST-запросов через JavaScript, чтобы не было обновления страницы"?
Профиль Ответить
02.11.2012 14:01:40 Проверка онлайн-статуса Сообщение #6
Admin

Admin

Администратор

Администратор

Дата регистрации:
27.05.2010 21:23:42

Сообщений: 3063

Ajax - это громоздкая библиотека, подключать которую имеет смысл, если сайт вовсю её будет использовать. А если только для одного скрипта, то гораздо разумнее делать вот так: http://myrusakov.ru/javascript-post.html
Профиль Ответить
05.11.2012 13:14:48 Проверка онлайн-статуса Сообщение #7
Default

Default

Эксперт

Эксперт

Дата регистрации:
12.06.2012 15:20:27

Сообщений: 102

не самый лучший вариант, но есть с чего оттолкнутся без средств js

$time = time();
$query = mysql_query("UPDATE users SET online='1', update_list=$time WHERE id_user=$id_user AND login='$login'";
$query_2 = mysql_query("SELECT login, update_list FROM users WHERE online = '1'";
while($result = mysql_fetch_array($query_2)){
$last_visit = $result['update_list'] + 60;
if(time() >= $last_visit){
$login_user = $result['login'];
$query = mysql_query("UPDATE users SET online='0', update_list=$last_visit WHERE login='$login_user'";

}
}
Профиль Ответить
06.11.2012 12:35:38 Проверка онлайн-статуса Сообщение #8
Casual

Casual

Освоившийся

Освоившийся

Дата регистрации:
13.10.2012 17:58:28

Сообщений: 20

Честно говоря, я думал, что отправка запросов с помощью объекта XMLHttpRequest, как написано в этой статье http://myrusakov.ru/javascript-post.html - это и есть Ajax.

По поводу приведенного php-кода. Не понятно почему это будет работать без средств js. Кода этот скрипт должен запускаться? Все равно каждый пользователь должен будет постоянно обращаться к серверу, чтобы получить свежий список тех, кто онлайн, а сделать это можно только через js.
Профиль Ответить
07.11.2012 05:10:52 Проверка онлайн-статуса Сообщение #9
Default

Default

Эксперт

Эксперт

Дата регистрации:
12.06.2012 15:20:27

Сообщений: 102

при каждом обновлении страницы идет выборка из базы пользователей со статусом онлайн, и и его время последнего обращение к скрипту, потом проверка идет, если текущее время больше последнего обращения + (определенные минуты, которые вы хотите определять пользователя в он лайне), то в поле этого пользователя заносим оффлайн
Профиль Ответить
07.11.2012 19:08:03 Проверка онлайн-статуса Сообщение #10
mischa.samolkaev

mischa.samolkaev

Продвинутый

Продвинутый

Дата регистрации:
12.07.2012 13:00:02

Сообщений: 74

Возможно моя идея нестандартна, но можно реализовать другим способом:
В файле клиента(допустим 'user_file'+id), инкрементируется значение количества вкладок с открытым сайтом, а при отсоединении, счетчик декрементируется, возможный код код такой (примерно)
----------------------------------------------------

file function.php

<?php
function userIncKlNmb(){
$usrFile='user_file_'+$_SESSION['USER_ID'];
if(!file_exists($usrFile))file_put_contents($usrFile,'0');
else {
$content=file_get_contents($usrFile);
file_put_contents($usrFile,(string)($content++));
}
}
function userDecKlNmb(){
$usrFile='user_file_'+$_SESSION['USER_ID'];
if(file_get_contents($usrFile)=='0')unlink($usrFile);
else {
$content=file_get_contents($usrFile);
file_put_contents($usrFile,(string)($content--));
}

}
?>

Любой скрипт с соединением клиента с сервером

<?php
session_start();
include_once('function.php');
userIncKlNmb():
register_shutdown_function('userDecKlNmb');
/*
Много кода
*/
?>

Страница с пользовательскими онлайнами

<?php
/*Анализом файлов получаем ассоциативный массив id=>значение
*/
foreach($array as $key=>$value){
if($value<1)echo "Пользователь $key офлайн";
else echo "Пользователь $key онлайн"
}
?>
Профиль Ответить