关于GCDAsyncSocket的一些个人理解

GCDAsyncSocket

GCDAsyncSocket 的读写都是异步的不会阻塞线程。

socket读写都是数据流,这个流一直存在,心跳不是必须的。如果不断开这个流通道就一直存在,读取和写入都通过这个流通道。

tag不参与流数据的传递,只是为了本地管理方便,是GCDAsyncSocket内部实现数据调度的一个东西,方便用户给数据打标记,方便读取。

发送信息在底层都是会被拆分成很细小的数据包发出去的,因此接受到的数据可以不是一次性接受完的。

每次可能收到一部分数据。读取时我们可能指定条件触发读取数据的方法。比如读取多长的数据就触发,又比如碰到回车断行数据就触发。

也可以收到数据就触发,然后处理这部分数据。

连接socket不必多说,主动调用才可以。链接socket会触发代理方法。

发送消息,会触发写消息的代理方法。每发送一个消息,就应该有一个读取消息。

读消息有很多种,指定读取的条件会根据条件触发读消息的代理。

可以这么理解。主动调用读消息,它就一直在那里可能是在后台一直读,当读到指定的条件时,触发代理方法。

如果处理完一次消息还要继续读取下次进来的数据,就要继续主动调用读数据的方法,会根据读数据的条件触发代理方法。

用到的代理方法大致如下:

//socket成功连接到才会服务器调用
  -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
 //接受到新的socket连接才会调用
  - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket;
 //读取数据,有数据就会调用
  - (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;
 //直到读到这个长度的数据,才会触发代理
  - (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag; 
 //直到读到data这个边界,才会触发代理 
  - (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
 //有socket断开连接调用
  - (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;

发消息时,通常我们有确保我们没有和服务器断开,如果断开了根据需要重连。

客户端要维持自己的心跳,来让服务器知道我们还连着。所谓心跳包就是开一个计时器,定时发送指定的信息。

服务器判断 时间间隔,如果超过一定的时间,服务器没收到来自客户端的信息,服务端就会端口链接。

我们在socket链接之后,就可以发送心跳包了。

[sock readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];是读取到边界的意思。当读取到边界时会触发代理方法。

封包处理:

数据包的封装,是需要一定的格式的,这个要和服务端协商一致。封装数据包时,要根据格式封装。

比如这个,先封装一个数据头,指定实际发送的数据内容的大小,自身的一些标志信息。以及一些分界标志等。后面是具体的数据。

像这里的数据报头,先转成json 再转成data 而不是直接转data发出去的。因为服务端要对报头进行json解析。

当然也可能是其他数据格式,比如protobuf消息数据,对象数据等。

/*封装报文**/
- (void)sendData:(NSData *)data :(NSString *)type toClinet:(NSString *)target;
{
    NSUInteger size = data.length;
    
    NSMutableDictionary *headDic = [NSMutableDictionary dictionary];
    [headDic setObject:type forKey:@"type"];
    [headDic setObject:@"CinentA" forKey:@"CinentID"];
    [headDic setObject:target forKey:@"targetID"];
    [headDic setObject:[NSString stringWithFormat:@"%ld",size] forKey:@"size"];
    NSString *jsonStr = [self dictionaryToJson:headDic];
    NSData *lengthData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableData *mData = [NSMutableData dataWithData:lengthData];
    //分界
    [mData appendData:[GCDAsyncSocket CRLFData]];
    
    [mData appendData:data];
    
    
    //第二个参数,请求超时时间
    [self.clinetSocket writeData:mData withTimeout:-1 tag:0];
    
}
//字典转为Json字符串
- (NSString *)dictionaryToJson:(NSDictionary *)dic
{
    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];
    return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

客户端要做的主要是:

  • 链接服务器,并维持心跳 维持心跳不是必须的
  • 封包,给服务器发送消息
  • 接受处理服务器的信息

服务端要做的主要是:

  • 数据包的拆解,
  • 数据的分发
  • 用户的调用
  • 每个用户的心跳刷新 维持心跳不是必须的
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容