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) 编辑 收藏 举报