处理Socket数据粘包问题
2016-09-22 13:43
579 查看
处理数据粘包问题思路如下:
socket数据就像一个水管,水管的水是一股一股流出来的
(假设数据是有一个一个的字典组成的,字典与字典之前用\n(换行符)区分)
例如:
其中一条数据为: {"key","value"}\n
收到的数据也可能为:
........
{"key","value"}\n
{"key","value"}\n
{"key","value"}\n
{"key","value"}\n
{"key",
会出现不完整的现象,因为socket发数据是一安次区分的,每次发送的数据大小可能是20KB超过的部分自然会被去掉,然后在下一次发送
下一次收到的数据一定是:
"value"}\n
{"key","value"}\n
{"key","value"}\n
{"key","value"}\n
........
只要在下一次接收数据时和上一次接收的数据拼接到一块就能获得完整的数据;
具实现方法是:
接收到一个数据后,先把这次的数据能提炼出来的字典提炼出来,显示给UI<
4000
/span>;然后把提炼出来的部分删掉,把尾巴留下来;下次再来一股数据时和上一次剩下的尾巴拼接在一块,继续处理,这样一直循环下去.....
代码部分如下
一、建立一个工具类 命名为DataControl.h
定义两个数据组分别保存二进制文件和处理好数据
添加并返回处理好的新数据方法
这样就可以方便的处理socket数据,本文只是以最简单的例子,具体使用中可能会有偏差,但具体思路不会有问题。
参考阅读:
☞ 利用GCDAsyncSocket实战经验
☞ Socket
断线重连问题
代码文件:
☞ 代码文件
socket数据就像一个水管,水管的水是一股一股流出来的
(假设数据是有一个一个的字典组成的,字典与字典之前用\n(换行符)区分)
例如:
其中一条数据为: {"key","value"}\n
收到的数据也可能为:
........
{"key","value"}\n
{"key","value"}\n
{"key","value"}\n
{"key","value"}\n
{"key",
会出现不完整的现象,因为socket发数据是一安次区分的,每次发送的数据大小可能是20KB超过的部分自然会被去掉,然后在下一次发送
下一次收到的数据一定是:
"value"}\n
{"key","value"}\n
{"key","value"}\n
{"key","value"}\n
........
只要在下一次接收数据时和上一次接收的数据拼接到一块就能获得完整的数据;
具实现方法是:
接收到一个数据后,先把这次的数据能提炼出来的字典提炼出来,显示给UI<
4000
/span>;然后把提炼出来的部分删掉,把尾巴留下来;下次再来一股数据时和上一次剩下的尾巴拼接在一块,继续处理,这样一直循环下去.....
代码部分如下
一、建立一个工具类 命名为DataControl.h
定义两个数据组分别保存二进制文件和处理好数据
@interface DataControl () { //保存二级制文件数据 NSMutableData *_currentData; //保存有用的字符串数据 NSMutableArray *_lastMessages; } @end
添加并返回处理好的新数据方法
-(void)appendingData:(id)data newData:(SocketDataBlock)block { //1、拼接二进制数据 [_currentData appendData:data]; //2、转化成字符串 NSString *string = [[NSString alloc] initWithData:_currentData encoding:NSUTF8StringEncoding]; NSLog(@"socket 收到的数据data = %@",string); //3、分割字符串 NSArray *stringArr = [string componentsSeparatedByString:@"\n"]; NSMutableArray *usefulStringArr = [NSMutableArray new]; //4、获取有用的字符串 for (NSString *str in stringArr) { if ([str hasPrefix:@"{"] && [str hasSuffix:@"}"]) { [usefulStringArr addObject:str]; } } //5、判断有没有新的字符串 NSMutableArray *newStringArr = [NSMutableArray new]; for (NSString *str in usefulStringArr) { if (![_lastMessages containsObject:str]) { [newStringArr addObject:str]; } } //6、返回新的字符串 保存老的数组 _lastMessages = usefulStringArr; block([self modelArrFrom:newStringArr]); _currentData = data; }
/** 数模转换 */ -(NSMutableArray*)modelArrFrom:(NSMutableArray*)stringArr { NSMutableArray *modelArr = [NSMutableArray new]; for (NSString *string in stringArr) { SocketModel *model = [SocketModel mj_objectWithKeyValues:string]; [modelArr addObject:model]; } return modelArr; }
这样就可以方便的处理socket数据,本文只是以最简单的例子,具体使用中可能会有偏差,但具体思路不会有问题。
参考阅读:
☞ 利用GCDAsyncSocket实战经验
☞ Socket
断线重连问题
代码文件:
☞ 代码文件
相关文章推荐
- socket缓冲区及阻塞模式/粘包问题/数据的无边界性
- 【Android学习】socket长连接,数据粘包问题
- CocoaAsyncSocket + Protobuf 处理粘包和拆包问题
- mina自定义编解码器接收处理byte数组(同时解决数据传输中的粘包、缺包问题)
- 即时通讯下数据粘包、断包处理实例(基于CocoaAsyncSocket)
- 解决在epoll中accept接收端口会漏处理的问题. 直到新的socket消息到达,epoll_wait才响应去接收socket端口数据的问题
- 处理粘包和半包有关问题的socket分包Java实现
- Socket粘包问题的处理
- 即时通讯下数据粘包、断包处理实例(基于CocoaAsyncSocket)
- socket的半包,粘包与分包的问题和处理代码
- golang中tcp socket粘包问题和处理
- Socket通讯中的粘包问题及处理方案
- mina自定义编解码器接收处理byte数组(同时解决数据传输中的粘包、缺包问题)
- Socket开发之通讯协议及处理(解决粘包问题)
- 游戏开发中AS3和服务端通过socket通讯,如何处理粘包的问题
- 即时通讯下数据粘包、断包处理实例(基于CocoaAsyncSocket)
- <转载>Socket开发之通讯协议及处理(解决粘包问题)
- erlang 解决socket 数据粘包问题
- Socket TCP/IP协议数据传输过程中的粘包和分包问题
- Apache mina 2.0.1 和 AS3 Socket 进行通讯(处理粘包问题)