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

本文详细探讨了在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();

}

转载于:https://www.cnblogs.com/rogo/archive/2012/01/10/2318306.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值