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编程本质的理解。
