IOS用GCDAsynsocket的疑惑,求各位帮忙~

萧瑟的魔笛 2014-12-30 01:00:28
用GCDAsynsocket第三方框架进行socket,连接和发送数据给服务端正常,服务端也返回数据了,但就是没法接收到数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag这个方法是代理方法,我已经把
socket.delegate = self,并在ViewController ()加入了<GCDAsyncSocketDelegate>,可就是没法接收到数据,麻烦各大神们帮忙解答下,小弟非常感谢。

...全文
452 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33280066 2015-12-07
  • 打赏
  • 举报
回复
我也遇到这个问题
changyulongcf 2015-12-05
  • 打赏
  • 举报
回复
请问楼主,这个问题解决了吗?我也遇到这个问题了,求解答。
萧瑟的魔笛 2014-12-30
  • 打赏
  • 举报
回复
引用 3 楼 junliang0824 的回复:
似乎有这样一个代理方法-(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代理方法,所以当你连接成功时调用一次,以后每次进来读完数据再调用一次,当下次有数据来时,就又可以进来了,不知道我说的够不够清楚
您说的这个[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]; } 麻烦大神帮看看了,谢谢~
junliang0824 2014-12-30
  • 打赏
  • 举报
回复
似乎有这样一个代理方法-(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代理方法,所以当你连接成功时调用一次,以后每次进来读完数据再调用一次,当下次有数据来时,就又可以进来了,不知道我说的够不够清楚
萧瑟的魔笛 2014-12-30
  • 打赏
  • 举报
回复
引用 1 楼 jinjianxinxh 的回复:
貌似这个和你的情况差不多 http://stackoverflow.com/questions/8368490/gcdasynsocketdelegate-didreaddata-method-is-not-called-using-gcdasynsocket
谢谢提供资料,不过他那种情况服务端和客户端都在同一台电脑上。不知道大神还有没有其他资料提供。
jinjianxinxh 2014-12-30
  • 打赏
  • 举报
回复
貌似这个和你的情况差不多 http://stackoverflow.com/questions/8368490/gcdasynsocketdelegate-didreaddata-method-is-not-called-using-gcdasynsocket

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧