[转]Flash使用服务器时间

[url]http://blog.csdn.net/zlxluofeng/archive/2010/05/10/5573650.aspx
[/url]
在做Flash应用时,有时可能会遇到需要使用服务器时间的情况,例如应用程序中显示当前系统时间、定时提醒等功能。使用new Date()创建的是客户端的时间,这并不是我们需要的,客户端时间很容易被用户更改,我们需要统一的服务器时间。

使用Flash与后台通信,我想您应该已经应用到您的项目中,不管使用哪种方式,都可以把服务器时间传到客户端,可以使用Http请求、Socket以及其他前后台通信的框架,只需要在后台中获取当前服务器时间,然后返回给前台。

需要服务器时间的时候,可以每次都请求后台来获取,但如果经常使用服务器时间来参与一些计算,那么每次请求就不是一件好的方式,例如客户端显示当前系统时间,难道要每秒钟都取获取一下服务器时间吗?再例如客户机的网速非常慢,请求服务器到返回结果的延迟比较长,这样获取到的时间误差比较大。

或许您已经想到了我们可以在开始时获取一次服务器时间,然后每次使用的时候,在前台计算出当前的服务器时间。Timer是Flash中用于计时的类,您或许想使用Timer来参与服务器时间的计算。在我之前的博文“Flash Player帧频、Timer计时 的时间间隔测试”中,测试了Timer计时的精确性,很遗憾Timer计时并不是精确的,无法参与到服务器时间计算中。

您是否使用过getTimer函数,在帮助文档中对于getTimer函数的描述是“返回初始化 Flash Player 后经过的毫秒数,并使用它来计算相对时间”。使用它来计算相对时间!这个正是我们需要的。

下面是一个计算当前服务器时间的类,您可以把该类的对象保存到全局变量中,然后第一次调用load()方法后,每次调用getServerTime()来获取服务器时间:

package  
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.getTimer;

/**
* 获取并计算服务器当前时间工具
* */
public class ServerTimeUtil extends EventDispatcher
{
// 连接服务器获取当前服务器时间的类
private var loader:URLLoader;
// 记录请求时返回的服务器时间
private var serverTime:Number = -1;
// 记录请求时当前flash player运行的时间
private var regTime:int;

public function ServerTimeUtil()
{
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
}

/**
* 初始获取服务器时间
* @url 服务器端用于返回当前时间的url地址,请求该地址必须可以返回服务器时间
* */
public function load(url:String):void
{
loader.load(new URLRequest(url));
}

private function onComplete(event:Event):void
{
// 记录请求完成时FlashPlayer时间
regTime = getTimer();

// 把服务器时间记录到serverTime中
// 需注意从服务器端返回的时候是从1970年1月1日到现在经过的毫秒数
// 如果服务器端返回的不是这个毫秒数,而是一个字符串时间或是一个Date对象,则需要您转换成上句中的毫秒数
var st:Number = Number(loader.data);
serverTime = st;

dispatchEvent(new Event(Event.COMPLETE));
}

/**
* 获取当前服务器时间
* @return 返回的数据为当前时间的Date对象,如果您需要一个Number对象,可以修改返回值
* */
public function getServerTime():Date
{
if(serverTime < 0)
{
// 服务器时间计算方式:当前服务器时间 = 当前FlashPlayer运行时间 - 请求时FlashPlayer运行时间 + 请求时服务器时间
var span:int = getTimer() - regTime;
var date:Date = new Date();
date.setTime(serverTime + span);
return date;
}
throw new Error("尚未获取到服务器时间");
}
}
}


上面这个类用来计算服务器时间,对于大多数情况都可以满足要求,不过我们刚才提到了一点“客户机的网速非常慢,请求服务器到返回结果的延迟比较长,这样获取到的时间误差比较大”,这个时候我们还需要做一点修正,让时间的误差更小一些(当然不可能做到完全无误差,只能让误差尽量的小)。

我增加了两个变量用来记录loader请求时的FlashPlayer运行时间和请求成功后的FlashPlayer运行时间,然后取这两个时间的平均值作为regTime的值,regTime就更接近于服务器端创建系统时间的这个时刻。下面是修改的内容:

private var startTime:int;  

private var endTime:int;

public function load(url:String):void
{
loader.load(new URLRequest(url));
startTime = getTimer();
}

private function onComplete(event:Event):void
{
// 记录请求完成时FlashPlayer时间
endTime = getTimer();
regTime = (startTime + endTime) / 2;

var st:Number = Number(loader.data);
serverTime = st;
dispatchEvent(new Event(Event.COMPLETE));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值