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巴西世界杯