flex定时重连服务端
?? ? ? ?本次主要是在上次的基础上进行完善,为了解决一个问题:如果服务端意外关闭,或者网络突然断开怎么办?想到了QQ掉线时的自动重连,于是改之。以前的socket,由于定义时会进行连接,那么初次就连接不上呢?以后能手动连接吗? ?? ? ? ? 对此,我们首先对socket进行修改,去掉.as文件(不过.as文件中readUTFBytes(bytesAvailable);如果放到mxml中,则会提示bytesAvailable未定义,此处没有用到,所以将.as文件略去,直接在script块中定义 public var socket:Socket = new Socket();在启动函数中进行连接 socket.connect("127.0.0.1",8001);//先连接,连不上 socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler); socket.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); socket.addEventListener(Event.CONNECT,connectHandler); socket.addEventListener(Event.CLOSE,closeHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);?? ? ? 然后,如果实行定时重连,得需要定时器 import flash.utils.Timer; public var myTimer:Timer = new Timer(5000);//5s后重连?? ? ?对于定时器,没有必要定义为Timer(5000,3)以为会连接3次这样,后面详细道来。 ?? ? ?下面是在哪里定时连接的问题,由于连接失败为ioError问题,所以,写在ioErrorHandler中 Alert.show("请确认服务器是否开启并确认网络连接正常!","连接失败(5s后重连)"); myTimer.addEventListener(TimerEvent.TIMER,timeHandler); myTimer.start();?? ? ? 注意的就是需要start启动定时器。下面我们在timeHandler里面进行重新连接,问题来了,连接不上,则ioError,遇到ioError了,又重连,如果直接添加连接,这不是死循环了吗?所以定义Timer的时候,哪怕定义为3次,实际也会不止的,因为这里是互相触发,我们引入一个static变量来统计连接次数?? ? public static var conneTime:uint=0;//统计连接次数 protected function timeHandler(event:TimerEvent):void {//这样就会连3次了 trace("connect again"); conneTime++; if(conneTime <3) socket.connect("127.0.0.1",8001); else Alert.show("连接超过3次,请检查网络情况"); } ?? ? ? 对于定时器,还有个很贱的地方,你不停,它就在那跑着,所以,连接上了之后,得赶紧停掉定时器,所以在connectHandler中调用Timer的stop方法。 protected function connectHandler(event:Event):void{ myTimer.stop();//连接成功,停止计时器 } ?? ? ? 那如果3次自动的没有连接上呢?客户端还开着呢,万一此时服务器又好了呢?如同网页提供刷新服务一样,虽然我们发布后也可以直接刷新搞定,不过在调试的时候,加上一个按钮,进行手动连接也是可以的,响应函数就一句socket的连接。 socket.connect("127.0.0.1",8001);?? ? ? 多和谐,目前最大的问题,在于如果没有socket,而调色板进行选择,则会报错,对不存在的socket进行操作,的确啊,都没连接,就write。这个时候,我们暂时选择Alert覆盖之。得到最后的成品文件如下: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="initApp()"> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> <s:HTTPService id="config" url="data/ehome.xml" result="config_resultHandler(event)"/> </fx:Declarations> <fx:Script> <![CDATA[ import flash.net.Socket; import flash.utils.Timer; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.events.CloseEvent; import mx.rpc.events.ResultEvent; import mx.utils.ColorUtil; [Bindable] private var employeeList:ArrayCollection; public var socket:Socket = new Socket(); public var myTimer:Timer = new Timer(5000);//5s后重连,没必要new Timer(5000,3) public static var conneTime:uint=0;//统计连接次数 //进度条和colorpicker都能改变显示色,所以共用change函数 protected function ChangeHandler():void{ var brite:uint=slider.value; var adjustedColor:uint = ColorUtil.adjustBrightness(colorPicker.selectedColor,brite); box.setStyle("backgroundColor",adjustedColor); socket.writeUTFBytes(colorPicker.selectedColor.toString(16)+'n');//得用string发送 socket.flush();//发送当前RGB值以测试,拖动条时会发送过多 trace(colorPicker.selectedColor.toString()); } //考虑可以socket传送改变,在启动时监听socket protected function initApp():void{ config.send(); socket.connect("127.0.0.1",8001);//先连接,连不上 socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler); socket.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); socket.addEventListener(Event.CONNECT,connectHandler); socket.addEventListener(Event.CLOSE,closeHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler); } protected function socketDataHandler(event:ProgressEvent):void{ trace("socketDataHandler"+event); } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } protected function closeHandler(event:Event):void{ Alert.show("服务器已关闭"); } protected function connectHandler(event:Event):void{ myTimer.stop();//连接成功,停止计时器 } protected function ioErrorHandler(event:IOErrorEvent):void {//如果定时器写这里,可能是个死循环 Alert.show("请确认服务器是否开启并确认网络连接正常!","连接失败(5s后重连)"); myTimer.addEventListener(TimerEvent.TIMER,timeHandler); myTimer.start(); } protected function timeHandler(event:TimerEvent):void {//这样就会连3次了 trace("connect again"); conneTime++; if(conneTime <3) socket.connect("127.0.0.1",8001);//出错的时候重连下,连不上又是ioerror else Alert.show("连接超过3次,请检查网络情况"); } protected function config_resultHandler(event:ResultEvent):void { employeeList = event.result.EHomeConfig.e_device_type.item; trace("employeeList.getItemAt(0).rgb.toString() :"+employeeList.getItemAt(0).rgb.toString() ); var temp:String = employeeList.getItemAt(0).rgb.toString();//设置初值 colorPicker.selectedColor = Number(Number("0x" + temp).toString(10)); trace("colorPicker.selectedColor : "+colorPicker.selectedColor.toString(10) ); box.setStyle("backgroundColor",colorPicker.selectedColor); } protected function connectToServer():void{ socket.connect("127.0.0.1",8001);//没连接,用户选择再次连接否 } ]]> </fx:Script> <mx:ColorPicker x="59" y="168" change="ChangeHandler()" id="colorPicker"/> <s:HSlider x="145" y="168" width="288" height="22" maximum="150" minimum="0" change="ChangeHandler()" id="slider"/> <s:Label x="145" y="198" text="亮度" height="19"/> <s:BorderContainer x="57" y="257" id="box"/> <s:Label x="57" y="370" text="示范颜色" width="51" height="11"/> <mx:DataGrid x="348" y="261" dataProvider="{employeeList}" > </mx:DataGrid> <s:Label x="57" y="111" width="113" height="22" id="RGB" text="{employeeList.getItemAt(0).rgb.toString()}" /> <s:Button x="59" y="431" label="连接服务器" id="connect" click="connectToServer()"/> </s:Application>? ?? ? ? 至此,基本搞定,经测试,存在2个小问题,一个是vc服务端不是很稳定,开着的时候,关了再连可能会导致崩溃;一个是弹出的Alert,哪怕不去点确定,在定时器作用下,也会连弹3次,说到这个,实在是蛋疼,有机会再深入改。不过总体来讲,定时重连的功能还是实现了的。 ?? ? ? 菜鸟goes on ~~~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |