很多同學一聽到Socket TCP UDP 這幾個字眼感覺特別害怕,很怕在工作當中使用,因為他們太底層了.下面我把我在工作中使用Socket類庫GCDAsyncSocket進行一次實戰
文章中只適用於小型數據傳輸, 如果比較到,例如音頻文件的話,請自行拼接data.
首先向工程導入GCDAsyncSocket.h/GCDAsyncSocket.m
下載地址:鏈接:http://pan.baidu.com/s/1c1bHytM密碼: p22g
然后創建一個單例類Client 繼承於NSObject
Client.h 文件內容如下
#import <Foundation/Foundation.h>
typedef void(^BLOCK)(idresult);
@interface RCClient : NSObject
+ (Client *)shareInstance;
- (void)sendMessage:(NSString *)strcomplete:(BLOCK)block;
@end
Client.m 文件內容如下:
#import "Client.h"
#import "GCDAsyncSocket.h"
// TCP連接
@interface Client ()
@property (nonatomic,strong)GCDAsyncSocket *socket;
@property (nonatomic,copy)BLOCK block;
@property (nonatomic,assign)NSInteger counter;
#define IP @"192.168.1.100"
#define PORT 5555
@end
@implementationClient
- (instancetype)init
{
self = [superinit];
if (self) {
[selfcreateConnection];
}
returnself;
}
+ (Client *)shareInstance {
staticClient *client =nil;
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
client = [[Clientalloc]init];
});
return client;
}
#pragma mark - 建立連接
- (void)createConnection {
self.socket = [[GCDAsyncSocketalloc]initWithDelegate:selfdelegateQueue:dispatch_get_main_queue()];
// 連接
NSError *error =nil;
[self.socketconnectToHost:IPonPort:PORTerror:&error];
if(error) {
NSLog(@"連接錯誤%@", error);
return;
}
[self.socketreadDataWithTimeout:-1tag:0];
}
// 發送數據
- (void)sendMessage:(NSString *)str tag:(NSInteger)tag complete:(BLOCK)block {
self.block = block;
[self.socketwriteData:[strdataUsingEncoding:NSUTF8StringEncoding]withTimeout:-1tag:0];
[self.socket readDataWithTimeout:-1 tag:0];
}
// tcp連接
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
NSLog(@"連接成功");
[self.socketreadDataWithTimeout:-1tag:0];
}
- (void)disconnection {
[self.socketdisconnect];
[self.socketreadDataWithTimeout:-1tag:0];
}
// 服務器返回數據
- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData *)data withTag:(long)tag {
NSString *str = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
NSLog(@"str = %@", result);
self.block(result);
[self.socketreadDataWithTimeout:-1tag:0];
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
NSLog(@"已經斷開連接!");
[self.socketreadDataWithTimeout:-1tag:0];
}
@end
轉自:http://blog.5ibc.net/p/32842.html