初次接触socket编程,还记得大学的时候对socket编程不屑一顾,同学做了个模拟qq的程序也不感兴趣。现在做移动开发,才发现socket或者http编程是多么的重要。如果你的程序要读取网络数据无非就是通过http或者socket。小型低效率程序可能可以通过http实现,http就是get/post也比较简单,大型程序或者要求效率的非socket莫属了。
现在在做iphone程序开发,于是研究了一下iphone下面的socket编程,谷歌百度一番之后发现某人贡献的开源socket框架AsyncSocket功能相当的强大,使用相当的简单。
首先到https://github.com/robbiehanson/CocoaAsyncSocket下载它,然后导入RunLoop目录里面的AsyncSocket.h和AsyncSocket.m文件,如果需要udp就把AsyncUdpSocket.h和AsyncUdpSocket.m也一起导入到项目里面去,最后添加framework:CFNetwork.framework,在程序中导入#import "AsyncSocket.h",准备工作就做完了。
asyncSocket=[[AsyncSocket alloc]initWithDelegate:self];
[asyncSocket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
后面那一句不能掉,原因不清楚,貌似是神马RunLoop相关的,我现在也不懂,以后懂了再来补充⋯⋯。
- (BOOL)acceptOnPort:(UInt16)port error:(NSError **)errPtr
//开启监听
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
[sock readDataWithTimeout:-1 tag:0];
}
//连接成功,打开监听数据读取,如果不监听那么无法读取数据
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
// NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length] - 2)];
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(msg);
// [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0];
[sock readDataWithTimeout:-1 tag:0];
}
//读取数据了,继续监听读取,注释的第2行可以替代最后一行,但是输出的数据最后也要追加"\r\n",这个iphone里面不用考虑。
主要就是这些。如果客户端断开了,服务器会主动调用委托事件。但是客户端不会主动调用,不知为何。
同样这篇文章也只提到了最关键的一些地方。具体怎么用AsyncSocket还得自己去体会。