iOS之GCDAsyncUdpSocket

作者: CrazySteven | 来源:发表于2016-07-09 15:06 被阅读5877次

上周说的是tcp socket,这周就来说说udp socket。先介绍下Demo,此次的Demo是用以前看黑马视频写的一个仿QQ聊天的Demo,以它为背景,使用udpSocket,自己给自己发送消息.

同样不说原理了,直接解释代码:

准备工作

#import "GCDAsyncUdpSocket.h"遵守协议<GCDAsyncUdpSocketDelegate>声明一个属性@property (strong, nonatomic)GCDAsyncUdpSocket * udpSocket;

创建Socket
_udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
监听接口&接收数据[1]
    NSError * error = nil;
    [_udpSocket bindToPort:udpPort error:&error];
    if (error) {//监听错误打印错误信息
        NSLog(@"error:%@",error);
    }else {//监听成功则开始接收信息
        [_udpSocket beginReceiving:&error];
    }
udp不用连接,故直接发送数据
[_udpSocket sendData:sendData toHost:ipAddress port:udpPort withTimeout:-1 tag:0];

对于toHost的参数ipAddress我说明一下,NSString * ipAddress = [self deviceIPAdress];[self deviceIPAdress]方法就是获取ip地址,具体可参见我另一篇文章《获取iOS设备信息(内存/电量/容量/型号/IP地址)

看看发送数据结果://此为GCDAsyncUdpSocket代理方法
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag
{
    NSLog(@"发送信息成功");
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error
{
    NSLog(@"发送信息失败");
}
发送成功就该接收数据了://此为GCDAsyncUdpSocket代理方法
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext
{
    NSLog(@"接收到%@的消息:%@",address,data);//自行转换格式吧
}

udp果然还是比tcp简单很多啊,到这里就结束了,最后是Demo,欢迎大家Star.

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!


  1. 接收信息有两种方法,[_udpSocket receiveOnce:&error]此方法是一条一条数据接收,用途往往是先发广播,接收到信息后使用TCP进行长连接,故只接收一条数据即可。[_udpSocket beginReceiving:&error]此方法是持续接收,像本Demo是用来聊天,自然是要持续接收信息,故使用此方法进行接收数据。

相关文章

网友评论

  • 冰三尺:请问下如果App退到后台还可以接受到数据吗?
  • 强力黑手:有个问题,接受数据这个方法不能使用呢。。。。。(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
  • 9004051f791b:请问执行了- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag 代理方法 发送数据成功了 怎么设置接收数据的响应时间呢?比如说设置个3s,3s没有接收到返回的数据,就设为失败?
    9004051f791b:@CrazySteven 谢谢,理解了。我们需要设定一个场景是3s接收不到数据就err。自己写个定时器处理了
    CrazySteven:@魏世鹏 socket是长连接啊,不需要设置时间啊
  • Decin:我遇到一个问题,
    [scanSocket enableBroadcast:YES error:&error];
    [scanSocket sendData:data toHost:strIP port:port withTimeout:dTimeout tag:EM_UDP_GETDEVNAME];
    // [scanDevice receiveWithTimeout:dTimeout tag:EM_UDP_GETDEVNAME]; // 该方法在老版本AsyncUdpSocket中
    发送数据并且收到udpSocket:didSendDataWithTag:回调, 但未进入udpSocket: didReceiveData: fromAddress: withFilterContext:该方法, 问题来了, 我想问, 新版本怎么实现AsyncUdpSocket的receiveWithTimeout:的效果, 处理接收超时
  • astring:请问在iOS10之后的手机不走发送的代理是为什么呢?iOS10以下的手机正常调用,请问有人遇到过吗?
  • qjsxq:楼主你好,我们用是UDP接受数据的,我用的GCDAsyncUdpSocket APP启动之后是正常的,APP进入后台时,我也调了close方法,但是APP在后台几分钟之后,再次启动时,接受数据的方法会瞬间调用很多次
    冰三尺:请问下, 退到后台是不能就收数据了吗?
    CrazySteven:@qjsxq 可能是你设置自动接收信息的方法有重复
  • 水煮杰尼龟:CFSocketSetAddress bind failure: 48 . 可知道这个是什么原因,虽然不影响使用·
    CrazySteven:@一个不无聊的IOS程序猿 我没遇到过,不过stackoverflow上有这个错误,你看看和你情况一不一样
  • Kaaaaai:当断网的时候,消息发送不出去,设置了超时时间,但这时候的返回方法是哪个?试过didnotsend那个但没有用
    CrazySteven:@Kaaaaai 断网应该就断开了吧?
  • 31377d398f35:您好! 我iPhone(客户端)与iPhone,iPad, iMac 发UDP都可以正常使用,为什么iPhone(客户端)和我们公司自己的WIFi产品和windows PC端他们收不到我发送的UDP呢?请指教...
    31377d398f35:@CrazySteven 要用C语言, 硬件是C语言. 谢谢您!
    CrazySteven:@我来也风行 应该是端口问题吧。wifi的信道不同也有可能
  • Dimon_Hu:你好,你是否使用过基于GCDAsyncUdpSocket添加私有协议?
    CrazySteven:@Dimon_Hu 没用过。
  • 改个Id:大神你好,请教一下, [_udpSocket bindToPort:udpPort error:&error]; 这个接口返回失败,是为什么Code=48 "Address already in use" Error in bind() function
    改个Id:@风_雨 我当时解决是因为端口被占用了,更换端口就好了
    BestVast:你好,请问这个问题你怎么解决的。我现在也遇到了,第一次正常,之后就报这个error。
    CrazySteven:@sobluewhat 端口已经被使用了,你换个端口。
  • shushuzhen:请教您一下:我这边现在是只做监听端口,就是手机作为服务端监听某个特定的端口,不发送数据,然后为什么我这边一直收不到数据呢?
    CrazySteven:只监听接口是不够的,需要执行接收数据啊。[_udpSocket beginReceiving:&error];
  • 七堇年华cc:你好,这个广播的udpport是随机获得的吗?为啥我send了数据,wireshark还是抓不到相应的UDP包
    CrazySteven:@七堇年华cc 服务器和客户端约定好保持一致即可
    七堇年华cc:@CrazySteven 先前抓包看了百度云盘的,每次开闪电互传,端口号都不同,我在想是端口区间内随机获取一个还是一直指定同一个port的?
    CrazySteven:@七堇年华cc 是自己指定的
  • 纠结的哈士奇:楼主试过udp发送图片么

    现在发现超过9k的图片,发送失败,提示message too long

    不知道怎么做了。。。
    4f70f079e295:我们不发送数据,就光接收数据 。但是 我绑定Wi-Fi的端口后,协议也不走。什么情况
    纠结的哈士奇:@CrazySteven 分片发也是一种思路,不过对于这个9k的问题,我想弄清楚一下,因为电脑上,通过终端设置下udp限制,可以实现发超过9k的data,但是在真机上就不行了

    不知道谁有这方面的经验?
    CrazySteven:@纠结的哈士奇 切开一段一段发
  • McDan:想请教一个问题如果连接的是5G的wifi可以发送成功 但是如果连接2.4G就会发送失败 sendTo函数返回-1错误码是ENOBUFS 55 /* No buffer space available */ 请问是什么原因
    CrazySteven:@McDan :fearful: 没用过5G的WiFi啊。。。
  • b5022f7b416c:你好,我想请教一下,我使用这个socket的时候出现了一些问题,希望能帮忙参考下。我是想做那种即时通讯的,程序运行一段时间后那个接收数据的代理函数就不走了,信息已经证实发出去了,但是就是接收不到。我在iOS7.1版本上好使在iOS9上就出现这种情况,请问有什么解决办法吗?
    此生浮华祇盼伊亽:我也遇到了这个问题,请问您解决了吗
    CrazySteven:@何国良 是不是你接收信息的命令没写啊?或是写的只接收一条数据啊

本文标题:iOS之GCDAsyncUdpSocket

本文链接:https://www.haomeiwen.com/subject/uhnrjttx.html