iOS UDP使用总结
在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使用总结相关推荐
- 【Boost】boost库asio详解9——UDP的简单例子1
服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...
- ios 接收 c# socket udp 组播
最近用wcf 服务 给ios和安卓做接口,做了几个ios的项目 用udp 组播 让ios多终端接收和刷新方法 做一个简单的小例子会把工程给大家下载的 c#代码:netSocketUDP.rar io ...
- Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
接上篇C#的Udp广播的发送和接收 http://www.cnblogs.com/JimmyBright/p/4637090.html ios中使用AsyncUdpSocket处理Udp的消息非常方便 ...
- 【Delphi】IOS 15 UDP 广播消息(局域网)
开发环境: FMX Delphi 11.2 试用版 IOS 15.0.2(iPhone 13 Pro Max) Android 10 手机(主要用来测试) 局域网(wifi环境) 在 IOS 中使用U ...
- 聊聊iOS中TCP / UDP 协议
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于 传输层协议. UDP(User Datagram protoco ...
- iOS TCP UDP通信
转自:https://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/NetworkingTo ...
- iOS 网络编程(二)UDP协议小结
UDP全称 用户数据报协议,User Datagram Protocol 解释与特点 - 解释:U D P是一个简单的面向数据报的运输层协议,进程的每个输出操作都正好产生一个U D P数据报,并组装成 ...
- boost::asio使用UDP协议通信源码实现
说明:以下源码来自参考文献[1], 比原文更丰富, 更有指导意义, 方便日后参考. udp servr端源码 //g++ -g udp_server.cpp -o udp_server -lboost ...
- iOS端Socket连接、发送数据(一)
一.Socket的应用 IM即时通讯是通过Socket的方式实现长连接,可运用于 (1)直播聊天室.礼物 (2)微信.QQ等即时聊天 (3)游戏对话.技能等 二.SOCKET原理 套接字(socket ...
最新文章
- 死磕算法!35 篇算法设计实例+6 本必读书打包送你
- FPGA之道(76)静态时序分析(二)一道时序分析的例题
- vs程序生成后找不到exe文件
- 2017年10月08日 上学
- 我想要一种语言,只需对它说我要干什么就行
- 【华为云技术分享】浅谈服务化和微服务化(上)
- 从文件扩展名获取MIME类型
- android判断进程是否是意外退出
- lua劈分字符串方法及实例
- iOS自动化测试驱动工具探索
- 从wireshark 抓包中的导出 H.264 变成可用暴风直接播放的H264 裸码流文件
- 基于multisim的晶体管放大器设计
- 腾达无线路由器怎么建立服务器,腾达无线路由器网关和域名服务器
- DAOS ARM64调测之旅
- google地址栏的代码是什么意思(转)
- easyexcel使用问题:使用时导出的excel文件损坏,打开不了,后台没异常错误
- LZY的计算器(暴力)
- Pytorch深度学习笔记(四)梯度向下算法
- 2022年8月29日 勒索病毒大爆发
- Acala 团队入选 UC Berkeley 2020 春季孵化加速器
热门文章
- 如何使用ps将图像标注
- 毫米级工艺手工修改PCB板
- Uniapp(H5)判断软键盘是否唤起、关闭事件
- 2021-2027全球与中国大尺寸石墨电极市场现状及未来发展趋势
- 几个网赚网站--待验证
- 《必备干货!程序员的自我修养高效学习方法》观后笔记
- nginx配置 yii2_Yii2如何应用配置nginx服务器
- 如何快速查找清理电脑中的重复文件?这款软件即可轻松实现!
- 安卓开发——问题:getFragmentManager().beginTransaction().add()传入v4.fragment出错
- ThinkPad T480高分屏第三方软件字体模糊解决办法