你的位置:首页 > 操作系统

[操作系统]CocoaAsyncSocket使用


代理的.h文件

//GCDAsyncSocketDelegate执行代理对象#import <Foundation/Foundation.h>#import "CocoaAsyncSocket.h"#import "Public.h"typedef void(^DidReadData)(NSDictionary* didReadData);/** * GCDAsyncSocketDelegate执行代理对象 */@interface NSObjectGCDAsyncSocket : NSObject<GCDAsyncSocketDelegate>/** * 接收到数据的处理 */@property(nonatomic,copy)DidReadData didReadData;/** * 发送的数据 如果添加新键值则需要先开辟内存 */@property(nonatomic,retain)NSMutableDictionary* writeData;/** * 发送链接请求 */-(BOOL)startConnect;/** * 单例 */+(NSObjectGCDAsyncSocket*)defaultSocket;@end

.m文件

//// NSObjectGCDAsyncSocket.m// attendance//// Created by dgc on 15/7/7.// Copyright (c) 2015年 dgc. All rights reserved.//#import "NSObjectGCDAsyncSocket.h"@implementation NSObjectGCDAsyncSocket{  GCDAsyncSocket* socket;}/** * 单例 * * @return */+(NSObjectGCDAsyncSocket *)defaultSocket{  //socket只会实例化一次  static NSObjectGCDAsyncSocket* socket=nil;  //保证线程安全,defaultSocket只执行一次  static dispatch_once_t once;  dispatch_once(&once, ^  {    socket=[[NSObjectGCDAsyncSocket alloc] init];  });  return socket;}/** * 初始化 * * * @return self */-(instancetype)init{  self=[super init];  if (self)  {    socket=[[GCDAsyncSocket alloc] initWithDelegate:self                     delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];  }  return self;}/** * 发送链接请求 */-(BOOL)startConnect{  //先确定断开连接再开始链接  if (socket.isConnected)  {    NSLog(@"主动断开");    [socket disconnect];      }  NSError* error;  BOOL isSuccess= [socket connectToHost:SocketHost                  onPort:SocketPort                   error:&error];  if (error)  {    NSLog(@"error.localizedDescription:%@",error.localizedDescription);  }  return isSuccess;  }#pragma mark - GCDAsyncSocketDelegate/** * 链接成功 * * @param sock sock实例 * @param host IP * @param port 端口 */-(void)socket:(GCDAsyncSocket *)sockdidConnectToHost:(NSString *)host     port:(uint16_t)port{  //  NSLog(@"%s",__FUNCTION__);//  NSLog(sock.isConnected?@"YES":@"NO");//  if (sock.isConnected)//  { //nsstring上传需要加"\n"分隔符方可上传成功/* [sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; *//* NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo", @"pswd":self.passWord, @"gpstype":@(2015), @"name":self.name, };    NSDictionary* agrement=@{@"vertion":@(1),                 @"type1":@(2),                 @"type2":@(0),                 @"type3":@(0)};*/    if ([NSJSONSerialization isValidJSONObject:self.writeData])    {//      NSLog(@"isValidJSONObject");      NSError* error;      //先转nsdata再转nsstring是为了保证nsdictionary格式不变      NSData *nsDataUser= [NSJSONSerialization dataWithJSONObject:self.writeData                                options:NSJSONWritingPrettyPrinted                                 error:&error];      NSString* json=[[NSString alloc] initWithData:nsDataUser                         encoding:NSUTF8StringEncoding];//      NSLog(@"nsDictionaryUser:%@",json);            json=[json stringByReplacingOccurrencesOfString:@"\n"                         withString:@""];      json=[json stringByReplacingOccurrencesOfString:@" "                         withString:@""];      json=[json stringByAppendingString:@"\n"];//      NSLog(@"json:%@",json);            [sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]        withTimeout:-1            tag:0];            //保持读取的长连接      [sock readDataWithTimeout:-1                 tag:0];            if (error)      {        NSLog(@"localizedDescription:%@",[error localizedDescription]);        NSLog(@"localizedFailureReason:%@",[error localizedFailureReason]);      }          }//  } }/** * 发送数据成功 * * @param sock sock实例 * @param tag 标记sock */-(void)socket:(GCDAsyncSocket *)sockdidWriteDataWithTag:(long)tag{//  NSLog(@"didWriteDataWithTag");}/** * 已经获取到数据 * * @param sock sock实例 * @param data 获取到的数据 * @param tag 标记sock */-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data   withTag:(long)tag{  //  NSLog(@"%s",__FUNCTION__);  NSError* error=nil;  NSDictionary* json=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:data                            options:NSJSONReadingAllowFragments                             error:&error];    NSLog([NSJSONSerialization isValidJSONObject:json]?@"is ValidJSONObject":@"is't ValidJSONObject");  if (error)  {    NSLog(@"socketError1:%@",[error localizedDescription]);     NSLog(@"socketError2:%@",[error localizedFailureReason]);  }  self.didReadData(json);  [sock disconnect];  }/** * 链接出错 * * @param sock sock实例 * @param err 错误参数 */-(void)socketDidDisconnect:(GCDAsyncSocket *)sock         withError:(NSError *)err{//  NSLog(@"%s",__FUNCTION__);    if (err)  {    NSLog(@"socketDidDisconnect:%@",[err localizedDescription]);    NSLog(@"socketDidDisconnect:%@",[err localizedFailureReason]);  }//  self.didReadData(nil);}@end

使用

创建对象  socket=[NSObjectGCDAsyncSocket defaultSocket];填写发送的数据socket.writeData=[NSMutableDictionary dictionaryWithDictionary:dictionary];处理收到的数据    socket.didReadData=^(NSDictionary* didReadData){.......}开始链接[socket startConnect];