iPhone的标准推荐是CFNetwork 库变成, 其封装好的开源库是 cocoa AsyncSocket 库, 用它来简化CFNetwork的调用, 它提供了异步操作
主要特征有:
- 队列的非阻塞的读和写, 而且可选超时. 你可以调用它读取和写入, 它会当完成后告知你
- 自动的socket接受. 如果你调用它接受连接, 它将为每个连接启动新的实例, 当然, 也可以立即关闭这些连接
- 委托(delegate)支持. 错误、连接、接受、完整的读取、完整的写入、进度以及断开连接, 都可以通过委托模式调用
- 基于run loop 的, 而不是线程的. 虽然可以在主线程或者工作线程中使用它, 但你不需要这样做. 它的异步的调用委托方法, 使用NSRunloop. 委托方法包括socket的参数, 可让你在多个实例中区分
自包含在一个类中. 你无需操作或者socket, 这个类帮你做了全部支持IPV4和IPV6的TCP流
使用
加入:AsyncSocket.h .m 与AsyncUdpSocket.h .m 四个文件 及 CFNetworking.framework
#import "AsyncSocket.h"
@interface HelloiPhoneViewController :UIViewController {
UITextField *textField;
AsyncSocket *asyncSocket;
}
@property (retain, nonatomic) IBOutlet UITextField *textField;
- (IBAction)buttonPressed:(id)sender;
- (IBAction)textFieldDoneEditing:(id)sender;
@end
在需要连接地方使用connectToHost连接服务器
其中initWithDelegate的参数中self是必须. 这个对象指针中的各个Socket响应的函数将被ASuncSocket所调用. initWithDelegate把将当前对象传递进去, 这样只要在当前对象方法实现响应方法
asyncSoket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
if(![asyncSocket connectToHost:host on:port error:&error])
{
NSLog(@"Error: %@", error);
}
关于NSData对象
NSData主要是带一个(id)data指向的数据空间和长度length
NSString 转换成NSData对象
NSData xmlData = [@"testdata" dataUsingEncoding:NSUTFStringEncoding];
NSData 转换成NSString 对象
NSData data;
NSString result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
发送数据
AsyncSocket wrinteData 方法来发送数据, 它有如下定义:
-(void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
以下是一个实例语句:
NSData *aData = [@"test data" dataUsingEncoding:NSUTF8StringEncoding];
[sock wrinteData:aData withTimeout:-1 tag:1];
在onSocket重载函数, 有如定义采用是专门用来处理SOCKET的发送数据的:
- (void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag
{
NSLig(@"thread(%), onSocket:%p didWriteDataWithTag:%d" , [[NSThread currentThread ] name], sock, tag);
}
接受Socket数据
在onSocket重载函数, 有如定义采用是专门用来处理SOCKET的接受数据的.
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
在中间将其转成NSSTring进行显示
NSString *aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];