Flex SDK在Apache 4.10.0 版本出来之前,Socket通信中只支持TCP协议。所以,现在我就来与大家分享下Flex Socket编程中的TCP通信。
首先介绍一个对象,XMLSocket。该对象是以XML格式来封装数据,有个好处就是方便我们处理和解析各种复杂的数据。因此,在大多数的Socket通信中,我都采用XMLSocket对象。下面是实现源代码:
package com.CommunityApp.core { import com.CommunityApp.events.*; import flash.events.*; import flash.net.*; import flash.utils.ByteArray; import flash.utils.Timer; import mx.core.*; import mx.utils.Base64Decoder; public class TcpSercvice extends EventDispatcher { private var FTcpSocket:XMLSocket; private var FSocketHost:String; private var FSocketPort:int; private var FConnectTimer:Timer=new Timer(2000, 0); private const csCoreDefaultTCPPort:int=9527; private var FIsSocketConnect:Boolean=true; public function TcpSercvice(aSocketHost:String):void { FTcpSocket=new XMLSocket(); //监听返回,错误等事件。 FTcpSocket.addEventListener(Event.CONNECT, OnConnectHandler); FTcpSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, OnSecurityErrorHandler); FTcpSocket.addEventListener(Event.CLOSE, OnCloseHandler); FTcpSocket.addEventListener(IOErrorEvent.IO_ERROR, OnIO_Error); FTcpSocket.addEventListener(DataEvent.DATA, OnioTCPServiceReceiveData); FSocketPort=csCoreDefaultTCPPort; FSocketHost=aSocketHost; FConnectTimer.addEventListener(TimerEvent.TIMER, OnConnectTimer); } public function Close():void { if (FTcpSocket.connected) FTcpSocket.close(); } public function SendMsg(xmlData:String):void //发送消息 { if (FTcpSocket.connected && xmlData != "") { FTcpSocket.send(xmlData); } else { Connect(); FTcpSocket.send(xmlData); } } private function OnConnectTimer(event:TimerEvent):void //连接超时后再次连接 { Connect(); } public function Connect():void //连接 { FTcpSocket.connect(FSocketHost, FSocketPort); } private function OnConnectHandler(event:Event):void { FConnectTimer.stop(); FIsSocketConnect=true; this.dispatchEvent(new TAppEvent(TAppEvent.APP_XMLCONNECTION_OPEN, false, false, null)); } private function OnCloseHandler(event:Event):void { FConnectTimer.start(); if (FIsSocketConnect) { FIsSocketConnect=false; this.dispatchEvent(new TAppEvent(TAppEvent.APP_XMLCONNECTION_CLOSE, false, false, null)); } } private function OnSecurityErrorHandler(event:SecurityErrorEvent):void { FConnectTimer.start(); if (FIsSocketConnect) { FIsSocketConnect=false; this.dispatchEvent(new TAppEvent(TAppEvent.APP_XMLCONNECTION_CLOSE, false, false, null)); } } private function OnIO_Error(event:IOErrorEvent):void { FConnectTimer.start(); if (FIsSocketConnect) { FIsSocketConnect=false; this.dispatchEvent(new TAppEvent(TAppEvent.APP_XMLCONNECTION_CLOSE, false, false, null)); } } public function ZDecompressString(aInString:String):String { var mDeCompressionStream:ByteArray; var mBase64Decoder:Base64Decoder=new Base64Decoder(); try { mBase64Decoder.decode(aInString); mDeCompressionStream=mBase64Decoder.flush(); mDeCompressionStream.uncompress(); return mDeCompressionStream.readUTFBytes(mDeCompressionStream.bytesAvailable); } catch (e:Error) { return ""; } return ""; } protected function OnioTCPServiceReceiveData(event:DataEvent):void { var mData:String=event.data; if (mData != "") { var dataXml:XML=new XML(event.data);//接收的数据 } } } }
需要特别注意的时,在使用XMLSocket时,我们一定要在数据包的末尾加上 ,因为XMLSocket在接受数据时,直到收到 才认为数据包接收完成。如果没有 标示符,那么会出现Flex端收到其他服务器发过来的数据时,并不会触发事件,而且一直在等待接收完成,这样我们就不会收到数据,请大家一定注意此细节。
彭亚欧个人博客原创文章,转载请注明出处
文章关键词:Flex Soket
文章固定链接:https://www.pengyaou.com/homeart/MjI=.html
下一篇 2014巴西世界杯