ios GCDAsyncSocket(Tcp)的使用

#pragma mark - GCDAsyncSocketDelegate

// 已连接

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port

{

  GessCoreLog(@"Connected: %@:%d", host, port);

  _status =SocketConnectionStatusConnected;

  if ([self.delegaterespondsToSelector:@selector(socketConnectionDidConnectedToServer:)]) {

    [self.delegatesocketConnectionDidConnectedToServer:self];

  }

  //已经连接上之后,开始读取data,调用下面的readDataToLength:withTimeout:tag:方法,在此方法中会调用到socket的代理方法: socket:didReadData:tag:方法。

  [_asyncSocket readDataToLength:self.packetHeaderLengthwithTimeout:self.receivingTimeoutIntervaltag:TAG_FIXED_LENGTH_HEADER];

}


// 收到报文,按顺序循环接收报文头,报文体。

//此方法的第一次调用是已经连接上的方法调用的时候。会读取data,然后调用代理的此方法。此时tag就事上面的TAG_FIXED_LENGTH_HEADER,所以第一次执行读取header

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)datatag:(long)tag

{

  switch (tag) {

    caseTAG_FIXED_LENGTH_HEADER: {// 1.已读取报文头,计算长度后继续读取报文体

      NSString *lengthString = [[[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding]autorelease];

      [_asyncSocketreadDataToLength:[lengthStringintegerValue]withTimeout:self.receivingTimeoutIntervaltag:TAG_RESPONSE_BODY];//继续读取数据,这次传的是TAG_RESPONSE_BODY,所以下次调用此方法的时候,执行TAG_RESPONSE_BODY部分。

    }

      break;

    caseTAG_RESPONSE_BODY:// 2.已读出报文体,转发报文体,然后继续读取报文头

      if ([self.delegaterespondsToSelector:@selector(socketConnection:didReceivedData:)]) {

        [self.delegatesocketConnection:selfdidReceivedData:data];

      }

      

      [_asyncSocketreadDataToLength:self.packetHeaderLengthwithTimeout:self.receivingTimeoutIntervaltag:TAG_FIXED_LENGTH_HEADER];//继续读,下次调用此方法时,tag是TAG_FIXED_LENGTH_HEADER

      break;

    default:

      break;

  }

}


  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值