单军华
2017-03-08 5fda93834efe5d08227712c07c9a580e8f123f01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
//  SocketDataControl.m
//  HeBeiFM
//
//  Created by Apple on 16/8/24.
//  Copyright © 2016年 Apple. All rights reserved.
/**
 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;然后把提炼出来的部分删掉,把尾巴留下来;下次再来一股数据时和上一次剩下的尾巴拼接在一块,继续处理,这样一直循环下去.....
 
 */
 
#import "DataControl.h"
#import "SocketModel.h"
#import "MJExtension.h"
 
@interface DataControl ()
{
    //保存二级制文件数据
    NSMutableData *_currentData;
    //保存有用的字符串数据
    NSMutableArray *_lastMessages;
}
@end
 
@implementation DataControl
 
 
+(DataControl*)shareControl
{
    static DataControl *control = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        control = [DataControl new];
    });
    return control;
}
 
-(instancetype)init
{
    if (self = [super init]) {
        //当前数据
        _currentData = [NSMutableData new];
        //保存上一次的数据
        _lastMessages = [NSMutableArray new];
    }
    return self;
}
 
-(void)appendingData:(id)data newData:(SocketDataBlock)block
{
    //1、拼接二进制数据
    [_currentData appendData:data];
    
    //2、转化成字符串
    NSString *string = [[NSString alloc] initWithData:_currentData encoding:NSUTF8StringEncoding];
    
    NSLog(@"socket 收到的数据data = %@",string);
    
    NSUInteger len = [_currentData length];
    Byte *byteData = (Byte*)malloc(len);
    memcpy(byteData, [_currentData bytes], len);
    
    for( NSUInteger i = 0; i < len; i++ )
    {
        NSLog(@"第%ld个数字:%x",i,byteData[i]);
    }
    
    //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;
}
 
-(void)clearData
{
    _currentData = nil;
    _currentData = [NSMutableData new];
}
 
@end