Flex Socket 通信中遇到的粘包问题

最近在项目中遇到了传说中的Socket粘包的问题

花了两三天时间弄这个 搞的真是人憔悴啊。

在socket通信的过程中, 当连续发送或时间差很小的情况下发送两个A B  那就就有可能同时收到 AB数据  或是 BA数据

那么解析的方式就要有所有变化了,就要分别获取A包的长度 和  B包的长度 来一个一个读取

我的相关处理代码如下:

/**

* socket数据处理

* @param event

*/

private function onSocketDataHandler(event:ProgressEvent):void

{

// 缓存数据

// 在有包头的情况下 写入接收的所有数据

// 如果读取不到包头 则当垃圾包进行处理 不进行缓存

while (socket.bytesAvailable)

{

if (!suspendedPackageHeader)

{

suspendedPackageHeader = readHeader(socket);

if (!suspendedPackageHeader) return;

}

 

socket.readBytes(incompleteReceivedData);

}

 

// 读取包的内容

var packageContent:String = 

incompleteReceivedData.readMultiByte(suspendedPackageHeader.packageLength, CHARSET);

processPackageContent(packageContent);

 

suspendedPackageHeader = null;

 

// 可能存在粘包情况

if (incompleteReceivedData.bytesAvailable)

parseNextPackage();

else

incompleteReceivedData.clear();

}

 

/**

* 解析粘包

*/

private function parseNextPackage():void

{

suspendedPackageHeader = readHeader(incompleteReceivedData);

if (!suspendedPackageHeader || 

incompleteReceivedData.bytesAvailable < suspendedPackageHeader.packageLength)

{

incompleteReceivedData.clear();

return;

}

 

var nextPackageContent:String = 

incompleteReceivedData.readMultiByte(suspendedPackageHeader.packageLength, CHARSET);

processPackageContent(nextPackageContent);

 

suspendedPackageHeader = null;

 

if (incompleteReceivedData.bytesAvailable)

parseNextPackage();

else

incompleteReceivedData.clear();

}

posted on 2012-01-10 17:02  Rogo_s_Blog  阅读(615)  评论(0编辑  收藏  举报

导航