iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫變成, 其封裝好的開源庫是 cocoa AsyncSocket 庫, 用它來簡化CFNetwork的調(diào)用, 它提供了異步操作
主要特征有:
- 隊(duì)列的非阻塞的讀和寫, 而且可選超時(shí). 你可以調(diào)用它讀取和寫入, 它會(huì)當(dāng)完成后告知你
- 自動(dòng)的socket接受. 如果你調(diào)用它接受連接, 它將為每個(gè)連接啟動(dòng)新的實(shí)例, 當(dāng)然, 也可以立即關(guān)閉這些連接
- 委托(delegate)支持. 錯(cuò)誤辜限、連接然遏、接受呼盆、完整的讀取秒咐、完整的寫入、進(jìn)度以及斷開連接, 都可以通過委托模式調(diào)用
- 基于run loop 的, 而不是線程的. 雖然可以在主線程或者工作線程中使用它, 但你不需要這樣做. 它的異步的調(diào)用委托方法, 使用NSRunloop. 委托方法包括socket的參數(shù), 可讓你在多個(gè)實(shí)例中區(qū)分
自包含在一個(gè)類中. 你無需操作或者socket, 這個(gè)類幫你做了全部支持IPV4和IPV6的TCP流
使用
加入:AsyncSocket.h .m 與AsyncUdpSocket.h .m 四個(gè)文件 及 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連接服務(wù)器
其中initWithDelegate的參數(shù)中self是必須. 這個(gè)對(duì)象指針中的各個(gè)Socket響應(yīng)的函數(shù)將被ASuncSocket所調(diào)用. initWithDelegate把將當(dāng)前對(duì)象傳遞進(jìn)去, 這樣只要在當(dāng)前對(duì)象方法實(shí)現(xiàn)響應(yīng)方法
asyncSoket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
if(![asyncSocket connectToHost:host on:port error:&error])
{
NSLog(@"Error: %@", error);
}
關(guān)于NSData對(duì)象
NSData主要是帶一個(gè)(id)data指向的數(shù)據(jù)空間和長度length
NSString 轉(zhuǎn)換成NSData對(duì)象
NSData xmlData = [@"testdata" dataUsingEncoding:NSUTFStringEncoding];
NSData 轉(zhuǎn)換成NSString 對(duì)象
NSData data;
NSString result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
發(fā)送數(shù)據(jù)
AsyncSocket wrinteData 方法來發(fā)送數(shù)據(jù), 它有如下定義:
-(void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
以下是一個(gè)實(shí)例語句:
NSData *aData = [@"test data" dataUsingEncoding:NSUTF8StringEncoding];
[sock wrinteData:aData withTimeout:-1 tag:1];
在onSocket重載函數(shù), 有如定義采用是專門用來處理SOCKET的發(fā)送數(shù)據(jù)的:
- (void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag
{
NSLig(@"thread(%), onSocket:%p didWriteDataWithTag:%d" , [[NSThread currentThread ] name], sock, tag);
}
接受Socket數(shù)據(jù)
在onSocket重載函數(shù), 有如定義采用是專門用來處理SOCKET的接受數(shù)據(jù)的.
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
在中間將其轉(zhuǎn)成NSSTring進(jìn)行顯示
NSString *aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];