代理的.h文件json
#import <Foundation/Foundation.h> #import "GCDAsyncSocket.h" typedef void(^SR_DidReadData)(NSDictionary* didReadData); /* */ @interface SocketRequest : NSObject<GCDAsyncSocketDelegate> @property(nonatomic,copy)SR_DidReadData sr_DidReadData; @property(nonatomic,retain)NSDictionary* sr_WriteData; /** * 單例 */ +(SocketRequest*)defaultSocket; /** * 發送連接請求 */ -(void)sr_StartConnect_WriteData:(NSDictionary*)writeData ReviceData:(SR_DidReadData)reviceData;
.m文件安全
#import "SocketRequest.h" #import "Public.h" NSString* BoolValue(BOOL value) { if (value) { return @"YES"; } return @"NO"; } @implementation SocketRequest { GCDAsyncSocket* socket; } /** * 單例 */ +(SocketRequest *)defaultSocket { //socket只會實例化一次 static SocketRequest* socket=nil; //保證線程安全,defaultSocket只執行一次 static dispatch_once_t once; dispatch_once(&once, ^ { socket=[[SocketRequest alloc] init]; }); return socket; } /** * 初始化 */ -(instancetype)init { self=[super init]; if (self) { socket=[[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; } return self; } /** * 發送連接請求 */ -(void)sr_StartConnect_WriteData:(NSDictionary*)writeData ReviceData:(SR_DidReadData)reviceData { //先肯定斷開鏈接再開始連接 FunctionLog(@"%@",BoolValue(socket.isConnected)); if (socket.isConnected) { [socket disconnect]; } self.sr_WriteData=writeData; self.sr_DidReadData = reviceData; NSError* error; /* 判斷不許(目標地址未開判斷爲YES) */ [socket connectToHost:SocketHost onPort:SocketPort error:&error]; if (!socket.isConnected) { if (self.sr_DidReadData) { self.sr_DidReadData(nil); } } } #pragma mark - <GCDAsyncSocketDelegate> /** * 發送數據成功 */ -(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { FunctionLog(@"socket_Success"); } /** * 已經獲取到數據 */ -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSError* error=nil; id json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; if (error) { FunctionLog(@"%@",error.localizedDescription); } else { if ([NSJSONSerialization isValidJSONObject:json]) { FunctionLog(@"%@",json); if (self.sr_DidReadData) { self.sr_DidReadData(json); } } } [sock disconnect]; } /** * 連接出錯 */ -(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { if (err) { FunctionLog(@"%@",err.localizedDescription); if (self.sr_DidReadData) { self.sr_DidReadData(nil); } } } /** * 連接成功 */ -(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { if ([NSJSONSerialization isValidJSONObject:self.sr_WriteData]) { NSError* error; //先轉nsdata再轉nsstring是爲了保證nsdictionary格式不變 NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:self.sr_WriteData options:NSJSONWritingPrettyPrinted error:&error]; NSString* json=[[NSString alloc] initWithData:nsDataUser encoding:NSUTF8StringEncoding]; json=[json stringByReplacingOccurrencesOfString:@"\n" withString:@""]; json=[json stringByReplacingOccurrencesOfString:@" " withString:@""]; json=[json stringByAppendingString:@"\n"]; /* 數據發送 */ [sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding] withTimeout:30 tag:0]; /* 數據讀取 */ [sock readDataWithTimeout:5 tag:1]; if (error) { FunctionLog(@"%@",error.localizedDescription); } } } @end
//nsstring上傳須要加"\n"分隔符方可上傳成功
/* [sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; */
使用socket
[[SocketRequest defaultSocket] sr_StartConnect_WriteData:@{} ReviceData:^(NSDictionary *didReadData) {}];