貌似这个和你的情况差不多
http://stackoverflow.com/questions/8368490/gcdasynsocketdelegate-didreaddata-method-is-not-called-using-gcdasynsocket

解决方案 »

  1.   

    似乎有这样一个代理方法-(void)socket:(GCDAsyncSocket *)sock didConnectToHost...,这个主要就是你作为客户端连接服务器,连接成功后会进入这个委托,你在这个里面加一句[m_tcpSocket readDataWithTimeout:-1 tag:0];,我这里的m_tcpSocket改成你自己的GCDAsyncSocket 对象。然后在-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag这个代理中,每次读完数据后再调用一次[m_tcpSocket readDataWithTimeout:-1 tag:0];就可以了。意思就是你每调用一次[m_tcpSocket readDataWithTimeout:-1 tag:0];当有数据发来时你就能进入一次didReadData代理方法,所以当你连接成功时调用一次,以后每次进来读完数据再调用一次,当下次有数据来时,就又可以进来了,不知道我说的够不够清楚
      

  2.   

    您说的这个[m_tcpSocket readDataWithTimeout:-1 tag:0];我都调用了,这样,我把代码贴上来,麻烦你帮忙看看是不是我哪里写错了。。
    #import "ViewController.h"
    #import "GCDAsyncSocket.h"@interface ViewController ()<GCDAsyncSocketDelegate>@end@implementation ViewController- (void)viewDidLoad {
        [super viewDidLoad];
        
        host = @"192.168.0.88";
        port = 8888;
        
    }
    //链接服务器
    //链接socket服务器按钮单击事件
    - (IBAction)btnConnectSocket_click:(id)sender
    {
        _lblSocketStatus.text = host;
        socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
        socket.delegate = self;
        NSError *err = nil;
        BOOL connState=[socket connectToHost:host onPort:port error:&err];
        if(!connState)
        {        _lblSocketStatus.text = [_lblSocketStatus.text stringByAppendingString:err.description ];
            NSLog(@"无法连接");
        }
     
    }
    //判断是否连接成功
    - (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port
    {
        NSLog(@"已连接到%@服务器",host);
        [socket readDataWithTimeout:-1 tag:0];
    }//发送信息
    //发送信息单击事件
    - (IBAction)btnSendMsg_Click:(id)sender
    {
        _txtQQ.text = [_txtQQ.text stringByAppendingString:@"\n"];
        [socket writeData:[_txtQQ.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
        NSLog(@"%@",_txtQQ.text);
        [socket readDataWithTimeout:-1 tag:0];
     
    }//接收信息
    //读取服务器获取的数据
    -(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    {
        //将UTF8转成GBK编码
        NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
        //将data转换成字符串
        NSString *recvMessage = [[NSString alloc] initWithData:data encoding:gbkEncoding];
        NSLog(@"%@",recvMessage);
        if (recvMessage == NULL)
        {
            NSLog(@"数据为空");
        }
        [socket readDataWithTimeout:-1 tag:0];
        
    }麻烦大神帮看看了,谢谢~