標籤:
很多同學一聽到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
iOS Socket/Tcp編程 GCDAsyncSocket的實戰(帶回調)