Flex+PHP反向推送(长轮询)
反向推送技术现在非常流行,而长轮询是实现反向推送的关键技术之一. //如果要轉載本文請注明出處,免的出現版權紛爭,我不喜歡看到那種轉載了我的作品卻不注明出處的人 Seven{See7di#Gmail.com} 首先将一下PHP端的代码,很简单? <?php//timeout in seconds$timeout = 60;// log start time$start_time = time();// get messge from local filefunction get_msg(){??? return file_get_contents('msg.txt');}// get message$last_msg = get_msg();// start the loopwhile (true){??? // get current time??? $current_time = time();?? ???? // check if we are timed out??? if ($current_time - $start_time > $timeout){??????? echo 'timeout! no new message!';??????? break;??? }?? ???? // get latest message??? $current_msg = get_msg();?? ???? // check if the message has been changed??? if ($last_msg != $current_msg){??????? echo $current_msg;??????? break;??? }??? // sleep 1 sec??? sleep(1);}分析上面的代码,其实原理就是在php中执行一个循环,每次循环的时候去访问服务器上的数据,可以是数据库也可以是一个文本文件,这里采用文本文件,然后判断文本文件的内容是否更新过,如果更新过则将数据返回给客户端. 在循环当中我们放入了 sleep(1)函数让代码每次循环的时候暂停1秒钟,这样不至于过度损耗服务器CPU的资源. 下面是flex端的代码 <?xml version="1.0" encoding="utf-8"?> ??????? <![CDATA[ ??????????? // request object ??????????? private var req:URLRequest; ?????????? ? ??????????? // loader object ??????????? private var loader:URLLoader; ?????????? ? ??????????? // timer ??????????? private var timer:Timer; ?????????? ? ??????????? [Bindable] ??????????? private var count:Number = 0;?????????? ? ?????????? ? ??????????? // do some initializing ??????????? private function init():void{ ??????????????? req = new URLRequest('http://127.0.0.1:8080/long_polling.php'); ??????????????? loader = new URLLoader(); ?????????????? ? ??????????????? loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,onStatusChange); ??????????????? loader.addEventListener(Event.COMPLETE,onComplete); ??????????????? loader.addEventListener(IOErrorEvent.IO_ERROR,onIOError); ?????????????? ? ??????????????? timer = new Timer(1000); ??????????????? timer.addEventListener(TimerEvent.TIMER,onTimer,false,true); ?????????????? ? ??????????? } ?????????? ? ??????????? // update the second count ??????????? private function onTimer(event:TimerEvent):void{ ??????????????? count ++; ??????????? } ?????????? ? ??????????? // start the request ??????????? private function startRequest():void{ ??????????????? count = 0; ??????????????? loader.load(req); ??????????????? timer.start(); ??????????????? this.txtLogs.text += 'Request started!n'; ??????????? } ?????????? ? ??????????? // status changed ??????????? private function onStatusChange(event:HTTPStatusEvent):void{ ??????????????? this.txtLogs.text += 'Status changed to '+ String(event.status)+'n'; ??????????? }?????????? ? ?????????? ? ??????????? // result returned ??????????? private function onComplete(event:Event):void{ ??????????????? this.txtLogs.text += 'Completed! Result is '+String(event.currentTarget.data)+'n'; ??????????????? this.txtLogs.text += 'Start another request!n'; ??????????????? this.startRequest(); ??????????? } ?????????? ? ??????????? // error handler ??????????? private function onIOError(event:IOErrorEvent):void{ ??????????????? this.txtLogs.text += 'IO Error: '+String(event)+'n'; ??????????????? this.stopRequest(); ??????????? } ?????????? ? ??????????? // stop the request ??????????? private function stopRequest():void{ ??????????????? count = 0; ??????????????? this.txtLogs.text += 'Request stopped!n'; ??????????????? this.txtLogs.text += '<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>n' ??????????????? this.timer.stop(); ??????????????? this.loader.close(); ?????????????? ? ??????????? } ??????? ]]> 我们新建一个flex项目,然后在界面上放置4个空间,两个按钮,一个是开始请求,一个是结束请求,还有一个label用来显示当前请求所花的时间,最后再放一个TextArea来显示log. 请求的原理也同样简单,通过URLLoader和URLRequest来实现,和普通的http请求并无两样.不过在一次请求获取到结果的时候(走到onComplete()函数),我们需要重新开始另外一次查询,通过这种方式我们就可以模拟出一个类似与C/S架构的网络连接,而服务端上的任何更新则会自动推送到客户端了.(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |