flex定时重连服务端

来源:互联网 发布:大数据课程 编辑:程序博客网 时间:2024/05/17 09:28

        本次主要是在上次的基础上进行完善,为了解决一个问题:如果服务端意外关闭,或者网络突然断开怎么办?想到了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);elseAlert.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传送改变,在启动时监听socketprotected 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);//出错的时候重连下,连不上又是ioerrorelseAlert.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 ~~~



原创粉丝点击