ActionScript: flash-часы, получающие текущее время с сервера

В этом блоге уже скопилось довольно много постов, посвящённых теме создания flash-часиков. В одной из последних статей по этой тематике приводился мини-обзор онлайн-сервиса clocklink, который не только предоставляет широкий выбор дизайнерских решений для флеш-часиков, но и позволяет настроить эти часики на отображение времени конкретного часового пояса. Естественно, это достигается за счёт взаимодействия флеш-плеера с серверными скриптами. Ведь сам Flash Player умеет только считывать время, установленное на локальном компьютере, а этого часто бывает недостаточно. И сегодня мы попытаемся сделать что-то подобное сервису clocklink своими руками...

Общий план: у нас есть серверный скрипт (пусть он будет написан на популярном языке PHP), который возвращает текущее время; флеш-приложение обращается к данному серверному скрипту, чтобы узнать текущее время, а затем использовать полученные данные для корректировки работы flash-часов.

Начнём с php-скрипта. Он, кстати, невероятно простой...

Код PHP:

<?php $curtime = time(); echo 'curtime='.$curtime; ?>

Что делает этот код? А он просто возвращает количество секунд (!), прошедших с начала эпохи Unix.

Откройте удобный вам текстовый редактор и перепишите приведённый выше код, а затем сохраните получившийся текстовый файл на сервере (!) как «gettime.php». И не забывайте, что все текстовые файлы, с которыми предполагается работа флеш-приложений, должны сохраняться в кодировке utf-8.

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

Код ActionScript 3.0:

import flash.events.*; import flash.net.*; var urlRequest:URLRequest = new URLRequest("gettime.php?"+Math.random()*int.MAX_VALUE); var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES; urlLoader.addEventListener(Event.COMPLETE, onComplete); urlLoader.load(urlRequest); function onComplete(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace(loader.data.curtime) }

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

Код ActionScript 3.0:

import flash.events.*; import flash.net.*; var urlRequest:URLRequest = new URLRequest("gettime.php?"+Math.random()*int.MAX_VALUE); var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES; urlLoader.addEventListener(Event.COMPLETE, onComplete); urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); urlLoader.load(urlRequest); function onComplete(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace(loader.data.curtime) } function onSecurityError(event:SecurityErrorEvent):void { trace("Ошибка!!!"); } function onIOError(event:IOErrorEvent):void { trace("Ошибка!!!"); }

Итак, теперь данные из php-скрипта загружены в flash-ролик. И эти данные можно использовать для настройки объекта Date (напомню, что именно класс Date отвечает в ActionScript 2.0/3.0 за работу с датой/временем).

Код ActionScript 3.0:

import flash.events.*; import flash.net.*; import flash.text.TextField; var urlRequest:URLRequest = new URLRequest("gettime.php?"+Math.random()*int.MAX_VALUE); var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES; urlLoader.addEventListener(Event.COMPLETE, onComplete); urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); urlLoader.load(urlRequest); function onComplete(event:Event):void { var loader:URLLoader = URLLoader(event.target); var curtime:Number = parseInt(loader.data.curtime,10) * 1000; var now:Date = new Date(curtime); var h:Number = now.getHours(); var m:Number = now.getMinutes(); var s:Number = now.getSeconds(); var tf:TextField = new TextField(); tf.text = "Текущее время: " + h + " ч. " + m + " мин. " + s + " сек.."; tf.width = 400; tf.height = 200; tf.x = 50; tf.y = 50; addChild(tf); } function onSecurityError(event:SecurityErrorEvent):void { trace("Ошибка!!!"); } function onIOError(event:IOErrorEvent):void { trace("Ошибка!!!"); }

Результат:

Здесь мы в качестве единственного параметра для конструктора объектов Date указали ранее полученное с сервера значение, но умноженное на 1000 (дело в том, что от сервера мы получили время в секундах, а конструктору объектов Date мы должны передать время в миллисекундах). Таким нехитрым образом мы загрузили данные о текущем времени с сервера. А что вы дальше будете делать с загруженными данными - это уже ваше дело.

Скачать исходники к данному уроку (под Adobe Flash CS 5.5).

ЗЫ: Думаю понятно, что точность возвращаемых сервером данных будет определяться настройками сервера + качество/скорость передачи данных с сервера в флеш-приложение.

Автор: admin

Дата добавления: 2012-07-04

Просмотров: 7785

Рейтинг поста: +21-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2015-06-18
Олег, вы плохо искали: http://edapskov.ru/pages.php?id=227
Комментатор
Комментарий добавил(а): Олег
Дата добавления: 2015-06-18
Спасибо за урок!
А подскажите как сделать так, что бы часы постоянно обновлялись? Ну, т.е., что бы те же секунды постоянно "тикали", а не показывали время запуска скрипта.
Комментатор
Комментарий добавил(а): Ульянов
Дата добавления: 2014-02-04
Всё работает, спасибо большое, выручили :)
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-02-02
Вроде, работает:


var loadVars:LoadVars = new LoadVars();
loadVars.onLoad = function(success:Boolean)
{
if (success)
{
/*
форматируем полученную с сервера дату в нужный нам формат
*/
var curtime:Number = parseInt(loadVars.curtime, 10) * 1000;
var now:Date = new Date(curtime);
var h:Number = now.getHours();
var m:Number = now.getMinutes();
var s:Number = now.getSeconds();
/*
выводим дату в текстовом поле
*/
var txtField:TextField = _root.createTextField("txtField", 0, 0, 0, 550, 400);
txtField.type = "dynamic";
txtField.text = "Текущее время: " + h + " ч. " + m + " мин. " + s + " сек..";
}
else
{
trace("Ошибка при работе с сервером!");
}
};
/*
загружаем данные с сервера
*/
loadVars.sendAndLoad("http://edapskov.ru/content/gettime.php", loadVars, "POST");


Путь до php-скрипта поменяйте на свой.
Комментатор
Комментарий добавил(а): Ульянов
Дата добавления: 2014-02-02
Большое вам спасибо! Но не могли бы вы показать, как всё это сделать под AS 2? Очень необходимо под as2, но знаний, к сожалению, не хватает.
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика