在iOS开发中,UDP通讯现在大多也使用GCD,很少用Runloop。然后粗略的了解了下UDP通讯。

Socket 是应用层和传输层之间的一层抽象协议,可以用来进行进程间通信,一般有 UDP 和 TCP 两种通信方式,前者速度稍快,稳定性不好,无法丢包重传。后者速度稍慢一点,但稳定性很好,可以丢包重传。

本文首先介绍使用 Socket 进行 UDP 通信。

UDP 通信流程:

使用 Socket 进行 UDP 通信的流程如下:

(1).创建一个 socket 对象

(2).准备好目标主机 IP 和目标端口

(3).绑定本机的端口

(4).发送/接收数据

(5).关闭套接字

客户端代码实现:

// 初始化socket
-(void)initSocket {self.title = @"服务器";dispatch_queue_t dQueue = dispatch_queue_create("Server queue", NULL);receiveSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:selfdelegateQueue:dQueue];NSError *error;// 绑定一个端口(可选),如果不绑定端口, 那么就会随机产生一个随机的电脑唯一的端口// 端口数字范围(1024,2^16-1)[receiveSocket bindToPort:SERVERPORT error:&error];if (error) {NSLog(@"服务器绑定失败");}// 开始接收对方发来的消息[receiveSocket beginReceiving:nil];
}// 接收消息代理
-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext {NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];/***  更新UI一定要到主线程去操作啊*/dispatch_sync(dispatch_get_main_queue(), ^{self.textView.text = msg;});NSLog(@"客户端ip地址-->%@,port--->%u,内容-->%@",[GCDAsyncUdpSocket hostFromAddress:address],[GCDAsyncUdpSocket portFromAddress:address],msg);NSString *sendStr = @"我收到了";NSData *sendData = [sendStr dataUsingEncoding:NSUTF8StringEncoding];// 该函数只是启动一次发送 它本身不进行数据的发送, 而是让后台的线程慢慢的发送 也就是说这个函数调用完成后,数据并没有立刻发送,异步发送[receiveSocket sendData:sendData toHost:[GCDAsyncUdpSocket hostFromAddress:address]port:[GCDAsyncUdpSocket portFromAddress:address]withTimeout:60tag:500];
}

客户端代码实现:

-(void)viewDidLoad {[super viewDidLoad];self.title = @"客户端";dispatch_queue_t qQueue = dispatch_queue_create("Client queue", NULL);sendSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:selfdelegateQueue:qQueue];NSError *error;[sendSocket bindToPort:CLIENTPORT error:&error];if (error) {NSLog(@"客户端绑定失败");}[sendSocket beginReceiving:nil];
}
// 发送消息
-(IBAction)sendMsgClick:(UIButton *)sender {NSData *sendData = [msgTF.text dataUsingEncoding:NSUTF8StringEncoding];[sendSocket sendData:sendDatatoHost:ipTF.textport:SERVERPORTwithTimeout:60tag:200];
}
// 发送消息失败回调
-(void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error {if (tag == 200) {NSLog(@"client发送失败-->%@",error);}
}
// 收到消息回调
-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext {NSString *receiveStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"服务器ip地址--->%@,host---%u,内容--->%@",[GCDAsyncUdpSocket hostFromAddress:address],[GCDAsyncUdpSocket portFromAddress:address],receiveStr);dispatch_sync(dispatch_get_main_queue(), ^{receiveLab.text = receiveStr;});
}
// 关闭套接字,并销毁
-(void)dealloc {[sendSocket close];sendSocket = nil;
}

iOS UDP使用总结相关推荐

  1. 【Boost】boost库asio详解9——UDP的简单例子1

    服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...

  2. ios 接收 c# socket udp 组播

    最近用wcf 服务 给ios和安卓做接口,做了几个ios的项目  用udp 组播 让ios多终端接收和刷新方法 做一个简单的小例子会把工程给大家下载的 c#代码:netSocketUDP.rar io ...

  3. Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇

    接上篇C#的Udp广播的发送和接收 http://www.cnblogs.com/JimmyBright/p/4637090.html ios中使用AsyncUdpSocket处理Udp的消息非常方便 ...

  4. 【Delphi】IOS 15 UDP 广播消息(局域网)

    开发环境: FMX Delphi 11.2 试用版 IOS 15.0.2(iPhone 13 Pro Max) Android 10 手机(主要用来测试) 局域网(wifi环境) 在 IOS 中使用U ...

  5. 聊聊iOS中TCP / UDP 协议

    TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于 传输层协议. UDP(User Datagram protoco ...

  6. iOS TCP UDP通信

    转自:https://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/NetworkingTo ...

  7. iOS 网络编程(二)UDP协议小结

    UDP全称 用户数据报协议,User Datagram Protocol 解释与特点 - 解释:U D P是一个简单的面向数据报的运输层协议,进程的每个输出操作都正好产生一个U D P数据报,并组装成 ...

  8. boost::asio使用UDP协议通信源码实现

    说明:以下源码来自参考文献[1], 比原文更丰富, 更有指导意义, 方便日后参考. udp servr端源码 //g++ -g udp_server.cpp -o udp_server -lboost ...

  9. iOS端Socket连接、发送数据(一)

    一.Socket的应用 IM即时通讯是通过Socket的方式实现长连接,可运用于 (1)直播聊天室.礼物 (2)微信.QQ等即时聊天 (3)游戏对话.技能等 二.SOCKET原理 套接字(socket ...

最新文章

  1. 死磕算法!35 篇算法设计实例+6 本必读书打包送你
  2. FPGA之道(76)静态时序分析(二)一道时序分析的例题
  3. vs程序生成后找不到exe文件
  4. 2017年10月08日 上学
  5. 我想要一种语言,只需对它说我要干什么就行
  6. 【华为云技术分享】浅谈服务化和微服务化(上)
  7. 从文件扩展名获取MIME类型
  8. android判断进程是否是意外退出
  9. lua劈分字符串方法及实例
  10. iOS自动化测试驱动工具探索
  11. 从wireshark 抓包中的导出 H.264 变成可用暴风直接播放的H264 裸码流文件
  12. 基于multisim的晶体管放大器设计
  13. 腾达无线路由器怎么建立服务器,腾达无线路由器网关和域名服务器
  14. DAOS ARM64调测之旅
  15. google地址栏的代码是什么意思(转)
  16. easyexcel使用问题:使用时导出的excel文件损坏,打开不了,后台没异常错误
  17. LZY的计算器(暴力)
  18. Pytorch深度学习笔记(四)梯度向下算法
  19. 2022年8月29日 勒索病毒大爆发
  20. Acala 团队入选 UC Berkeley 2020 春季孵化加速器

热门文章

  1. 如何使用ps将图像标注
  2. 毫米级工艺手工修改PCB板
  3. Uniapp(H5)判断软键盘是否唤起、关闭事件
  4. 2021-2027全球与中国大尺寸石墨电极市场现状及未来发展趋势
  5. 几个网赚网站--待验证
  6. 《必备干货!程序员的自我修养高效学习方法》观后笔记
  7. nginx配置 yii2_Yii2如何应用配置nginx服务器
  8. 如何快速查找清理电脑中的重复文件?这款软件即可轻松实现!
  9. 安卓开发——问题:getFragmentManager().beginTransaction().add()传入v4.fragment出错
  10. ThinkPad T480高分屏第三方软件字体模糊解决办法