• CocoaAsyncSocket使用


    代理的.h文件

    #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:@"
    "
                                                 withString:@""];
            json=[json stringByReplacingOccurrencesOfString:@" "
                                                 withString:@""];
            json=[json stringByAppendingString:@"
    "];
            /*
             数据发送
             */
            [sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]
                withTimeout:30
                        tag:0];
            /*
             数据读取
             */
            [sock readDataWithTimeout:5
                                  tag:1];
            if (error)
            {
                FunctionLog(@"%@",error.localizedDescription);
            }
        }
    }
    @end
     //nsstring上传需要加"
    "分隔符方可上传成功
    /*
     [sock writeData:[@"ABCABCABCABCABCABC
    " dataUsingEncoding:NSUTF8StringEncoding]
     withTimeout:-1
     tag:0];
     */

    使用

    
    
    [[SocketRequest defaultSocket] sr_StartConnect_WriteData:@{}
                                                      ReviceData:^(NSDictionary *didReadData)
    {}];
    
    
  • 相关阅读:
    WCF 发布在iis上
    记一次服务器迁移过程
    期末总结
    典型用户和用户场景
    软件工程第四次作业 结对编程 增量开发
    第三次作业 结对编程
    我对git认识
    浅谈对IT的认识!
    本地Git仓库和远程仓库的创建和关联及github上传(git push)时出现error: src refspec master does not match any解决办法
    CSS下拉菜单
  • 原文地址:https://www.cnblogs.com/louyizhidu/p/4969592.html
Copyright © 2020-2023  润新知