zoukankan      html  css  js  c++  java
  • iOS Socket/Tcp编程 GCDAsyncSocket的实战(带回调)

    很多同学一听到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

  • 相关阅读:
    wget/curl查看请求响应头信息
    对软件测试的理解
    负载测试、压力测试和性能测试的区别
    经典测试面试题
    软件测试的目的和任务
    为cloudstack搭建ceph文件系统
    多网卡绑定实例
    牛客多校5 A-gpa(01分数规划)
    HDU
    2018ACM-ICPC宁夏邀请赛 A-Maximum Element In A Stack(栈内最大值)
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyublogs/p/5855852.html
Copyright © 2011-2022 走看看