一个B/S的用户在线计费系统代码.用到Flash Media Server作服务器,使用rtmp协议来保持客户端的连接。
实现了被动计费(从客户端开始连接到断开连接的时间)和主动计费(从客户端开始连接到服务器主动验证客户端的连接时间)两种方式
需要保证Web服务端与FMS的链接安全,这个比较容易实现,IP策略就可以。也可以在FMS向Web服务端提交验证的页面做一个来路检测。
main.asc 代码
//Flash客户端连接FMS服务器后执行
application.validate = function(data,p_client){
p_client.s = new Date();//记录首次访问时的系统时间。
p_client.key = data;//用户凭证,我在这里面放的是一段加密凭证,由Flash从客户端提交
var my_lv = new LoadVars();
my_lv.onLoad = function( success )
{
if(success)
{
if(this.key)
{
application.acceptConnection(p_client);
}
else
{
application.rejectConnection(p_client);
}
} else
{
application.rejectConnection(p_client);
}
};
my_lv.load("http://xxx.com/validate.aspx?data=" + p_client.key + "&c=" );//通过这个页面解密
}
//Flash客户端断开FMS服务器后执行
application.disconnect = function(p_client){
var c = Math.round((new Date() - p_client.s)/1000);//这里是为了计算连接的秒数
var my_lv = new LoadVars();
my_lv.onLoad = function( success )
{
//需要FMS处理的代码
};
my_lv.load("http://xxx.com/validate.aspx?data=" + p_client.key + "&c=" + c +"&e=");//C 为客户端连接的秒数
}
application.onConnect = function(p_client,p_key)
{
application.validate(p_key,p_client);
}
application.onDisconnect = function(p_client)
{
application.disconnect(p_client);
}
//为了防止FMS服务或WEB服务出现异常,采用轮询的方式主动计费,以防止客户端出现未计费现象
//(这个方法的原则是保证FMS主动检测时间到客户端开始时间的费用已计算)
online = function () {
for (var i = 0; i<application.clients.length; i++) {
if (application.clients[i].ping()) {
//如果客户端还存在连接
var my_lv = new LoadVars();
var server_time = new Date();
my_lv.load("http://xxx.com/validate.aspx?data=" + application.clients[i].key + "&live=" + server_time +"&e=");//
} else {
application.disconnect(application.clients[i]);
}
}
};
setInterval(online, 6000);//检测时间间隔根据具体情况而定,时间越短,服务请求越多