iOS从零开始学习socket编程——高并发多线程服务器

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    //处理数据
}

我们只用将这个方法进行简单地修改就可以支持多线程处理数据。

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    __block AsyncSocket *localSocket = sock;
    __block NSData *localData = data;
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"thread = %@",[NSThread currentThread]);
        [self dealWithData:localSocket Data:localData];
    });
}

这里创建了三个block类型的对象避免在block中出现循环引用的问题。 接下来实现dealWithData方法:

- (void)dealWithData:(AsyncSocket *)sock Data:(NSData *)data{
    //这个方法和AnsycSocket的didReadData方法极为类似
    /*
        处理相关数据
    */
    dispatch_async(dispatch_get_main_queue(), ^{
        [sock writeData:data withTimeout:-1 tag:ECHO_MSG];
        [sock disconnectAfterWriting];
    });
}

可以看出,只是简单的新增了一个线程并且把原来需要在didReadData方法中实现的内容搬到了自定义的函数中。处理完成数据后,记得在主线程中写入数据即可。

PS:didReadData可能会出现无法获取数据或多次获取数据的问题。处理方法见我的另一篇博客《AsyncSocket didReadData函数详解》 地址: 最后唠叨一句:OC并不适合做服务区开发,这里写了很多只是为了加深对Socket编程本质的理解。

经验分享 程序员 微信小程序 职场和发展